我現在超級困惑。 我已經在fxml代碼中創建了一個窗格並設置了一個onKeyPressed事件。KeyEvents和焦點JavaFX
pane.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
System.out.println("I'm here");
jump(event);
}
});
這沒有奏效。窗格沒有捕獲任何KeyEvent。從不打印「我在這裏」。 然後,我想設置場景的onKeyPressed,這是可行的,但我必須在控制器中進行,因爲我想在按鍵過程中處理的事情必須在Controller中完成。
然後我打電話給pane.getScene().setOnKeyPressed()
但是給了nullPointerException
,因爲我發現我不得不叫initialize()
以外。
所以我創建了一個按鈕和一個附加事件的OnAction給它,它打印出我的窗格的場景,嘗試,如果它確實有效。
@FXML
public void printScene() {
System.out.println(pane.getScene());
}
當我點擊按鈕時,它打印出我的窗格的場景,因爲它應該有。但是後來,我意識到我的窗格現在捕獲了KeyEvents。除了使用Fxml添加按鈕以外,我什麼都沒有改變,現在窗格捕獲KeyEvents?當我註釋掉該按鈕的代碼時,該窗格不再捕獲KeyEvents
<Button onAction="#printScene"/>
這是我爲按鈕使用的所有代碼。
注意:我也試過pane.requestFocus()
和pane.SetFocusTraversable(true)
也沒有工作。但是突然添加一個按鈕會使其工作?我感到很困惑。
整個代碼:
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("sample.fxml"));
Parent root = fxmlLoader.load();
Scene scene = new Scene(root, 800, 600);
primaryStage.setTitle("Game");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
public class Controller {
@FXML private Pane pane;
@FXML private Rectangle cube;
public void initialize() {
pane.requestFocus();
pane.setFocusTraversable(true);
pane.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
System.out.println("I'm here");
jump(event);
}
});
System.out.println(pane.getScene());
}
}
//FXML Code
<Pane fx:controller="sample.Controller" fx:id="pane"
xmlns:fx="http://javafx.com/fxml">
<Rectangle width="800" height="20" layoutY="580" fill="green"/>
<Rectangle fx:id="cube" width="40" height="40" layoutX="5" layoutY="540"/>
<!--<Button />-->
</Pane>
取消註釋按鈕可以使窗格增益焦點,並且反之亦然。
不知道爲什麼添加按鈕,將焦點聚集到面板中,或者爲什麼'pane.requestFocus()'沒有工作(你需要發佈[MCVE]吃出回答)。做到這一點的最好方法是在場景中註冊一個監聽器,您可以在這個場景中創建場景。此時,應該也可以獲得對控制器的引用,以便可以從處理程序調用控制器上的方法。 –
我會盡快發佈所有代碼,感謝您的幫助。我還在initialize()方法中調用requestFocus,也許這就是爲什麼它不起作用? – Random
@James_D我已經發布了整個代碼。如果你能看看,我會很高興^^ – Random