JavaFX TextPane不显示更新的文本

时间:2018-01-09 15:32:58

标签: java javafx

我有一个Pane(下面的所有代码),其中包含一个带有2个subPanes,VisualPane和TextPane的HBox。当有人按ENTERSPACE时,我希望程序打印“按下输入”。和“空间紧迫”。分别。按下ESCAPE时,我希望应用程序关闭。

TextPane包含一个带有私有TextArea的窗格。使用方法push(String message)清除TextArea,然后填充新消息。

然而,当你按Enter或Space时没有任何反应。无论您按下按钮多少次,“文本”都会在控制台中打印一次。每当按下Escape时,程序仍会退出。

为什么push()方法“冻结”TextArea?

代码:

public class GamePane extends Pane {

  private VBox content;
  private HBox textBox;

  private VisualPane visualPane;
  private TextPane textPane;

  public GamePane(){
    initialize();
  }

  private void initialize(){
    this.content = new VBox();
    getChildren().add(content);
    this.textBox = new HBox();

    this.visualPane = new VisualPane();
    this.textPane = new TextPane();

    content.getChildren().add(visualPane);
    content.getChildren().add(textBox);
    textBox.getChildren().add(textPane);

    this.setOnKeyPressed(e -> {
      switch (e.getCode()){
        case ENTER:
          this.textPane.push("Button pressed.");
          break;

        case SPACE:
          this.textPane.push("Button pressed.");
          break;

        case ESCAPE:
          Platform.exit();
          break;
      }
    });
  }
}

public class TextPane extends Pane {

  private TextArea textArea;

  public TextPane(){
    initialize();
    push("Text");
  }

  private void initialize(){
    this.textArea = new TextArea();
    textArea.setMinWidth(Constants.width);
    textArea.setMinHeight(Constants.height * 4 / 11);

    textArea.setEditable(false);
    textArea.setStyle("-fx-font-size: 3em;");

    getChildren().add(textArea);
  }

  public void push(String message){
    textArea.clear();
    textArea.setText(message);
    System.out.println("Text");
  }
}

PS:

GamePane有一个HBox文本框,用于添加内容。

2 个答案:

答案 0 :(得分:1)

this.setOnkeyPressed(..)更改为this.setOnKeyReleased(..)

如果您的节点在程序启动时没有焦点,您可能还需要添加this.requestFocus();

import javafx.application.Platform;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;

public class GamePane extends Pane
{

    private VBox content;
    private HBox textBox;

    private VisualPane visualPane;
    private TextPane textPane;

    public GamePane()
    {
        initialize();
    }

    private void initialize()
    {
        this.content = new VBox();
        getChildren().add(content);
        this.textBox = new HBox();

        this.visualPane = new VisualPane();
        this.textPane = new TextPane();

        content.getChildren().add(visualPane);
        content.getChildren().add(textBox);
        textBox.getChildren().add(textPane);

        this.setOnKeyReleased(e -> {//Change here!
            switch (e.getCode()) {

                case ENTER:
                    this.textPane.push("Enter pressed.");
                    break;

                case SPACE:
                    this.textPane.push("Space pressed.");
                    break;

                case ESCAPE:
                    System.out.println("escaped pressed");
                    Platform.exit();
                    break;
            }
        });

        this.requestFocus();//Change here!
    }
}

您是否也知道为什么OnKeyPressed的行为与OnKeyReleased不同?

  

这个答案来自于   JavaDocs

     

"键入键入"事件是更高级别的,通常不依赖于   平台或键盘布局。它们是在Unicode时生成的   输入字符,是了解的首选方式   字符输入。在最简单的情况下,生成键类型事件   通过单键按下(例如,' a')。然而,通常,角色是   由一系列按键(例如,SHIFT +' a')产生的,以及映射   从按键事件到关键类型事件可以是多对一或   许多到很多。 通常不需要密钥发布来生成   密钥类型事件,但在某些情况下键入的事件是   在释放密钥之前不生成(例如,输入ASCII   序列通过Windows中的Alt-Numpad方法)。没有键入事件   是为不生成Unicode字符的密钥生成的(例如,   动作键,修饰键等。)。

答案 1 :(得分:0)

在控制台中显示Text一次的原因是push(String message)构造函数中调用了TextPane方法。

问题很可能是由于GamePane不是场景图中的焦点Node

要解决此问题,您可以在GamePane添加到GamePane之后重点关注Scene请求。 e.g:

public class GameApplication extends Application {

    @Override
    public void start(Stage primaryStage) {        
        GamePane gamePane = new GamePane();        
        Scene scene = new Scene(gamePane);
        gamePane.requestFocus();
        primaryStage.setScene(scene);
        primaryStage.show();
    }

}