私は今スーパー混乱しています。 私はfxmlコードでペインを作成し、onKeyPressedイベントを設定しました。キーイベントとフォーカスのJavaFX
pane.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
System.out.println("I'm here");
jump(event);
}
});
これは機能しませんでした。 PaneはKeyEventsをキャッチしませんでした。決して印刷されていない "私はここにいる"。 は、その後、私は作品シーンのonKeyPressedを、設定したいが、私は、キーを押して中に扱うようにしたいものがコントローラで行われなければならないとして、コントローラにそれをしなければなりません。
私はpane.getScene().setOnKeyPressed()
を呼び出しましたが、それはinitialize()
の外に電話しなければならないことがわかったので、nullPointerException
となりました。
だから私はそれが本当に動作するかどうか試してみ、私のペインのシーンをプリントアウトされ、ボタンを作成し、それにOnActionイベントを添付。
@FXML
public void printScene() {
System.out.println(pane.getScene());
}
ボタンをクリックしたときに、自分のペインのシーンが印刷されるように印刷されました。しかし、その後、私のペインがKeyEventsをキャッチすることに気付きました。私はFxmlを使用してボタンを追加する以外は何も変更していないので、Paneは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