我是Java和Java FX的新手,我尝试使用场景构建器制作带按钮的面板。我希望我的应用程序只响应按下的箭头键。我在Controller
课程中制作了以下方法:
public void keyPressed(KeyEvent key) {
switch(key.getCode()) {
...some code here
}
}
之后我在场景构建器中选择了这个方法,但是当我运行我的应用程序时,按下箭头键时没有任何反应。 有人可以帮帮我吗?
答案 0 :(得分:3)
如果没有看到你的其余代码和FXML,很难说,这是完整的例子
你错过的可能事情
代码
public class Main extends Application {
private class Controller {
@FXML // <== perhaps you had this missing??
void keyPressed(KeyEvent event) {
switch (event.getCode()) {
case LEFT:
case KP_LEFT:
System.out.println("to the left");
break;
case RIGHT:
case KP_RIGHT:
System.out.println("to the right");
break;
default:
break;
}
}
}
@Override
public void start(Stage primaryStage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/foo.fxml"));
loader.setController(new Controller());
primaryStage.setScene(new Scene(loader.load()));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
FXML
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<GridPane onKeyPressed="#keyPressed" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<Button mnemonicParsing="false" text="Button" />
</children>
</GridPane>
答案 1 :(得分:1)
KeyCode还允许与特定密钥进行比较
@FXML
private void keyPressed(KeyEvent keyEvent)
if (keyEvent.getCode() == KeyCode.ENTER) {
// do some actions
}
}
您可以从here获取所有关键代码。没有使用开关,这是一个很好的方法。
答案 2 :(得分:0)
KeyCode
有isArrowKey()
方法,因此,如果您从事件处理程序中调用keyPressed
方法,则可以执行以下操作:
public void keyPressed(KeyEvent key){
if(key.getCode().isArrowKey()){
...some code here
}
}
如果您需要根据按下的箭头键执行不同的操作,请确保您的切换案例与KeyCode.UP
/ DOWN
/ LEFT
/ RIGHT
进行比较。如果它们是,那么您可能没有正确设置事件处理程序,或者由于线程问题而导致GUI挂起。如果您需要更多帮助,请发布您处理活动的地方。