我有一个Pane(下面的所有代码),其中包含一个带有2个subPanes,VisualPane和TextPane的HBox。当有人按ENTER
或SPACE
时,我希望程序打印“按下输入”。和“空间紧迫”。分别。按下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文本框,用于添加内容。
答案 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();
}
}