2017-04-08 17 views
0

私は今スーパー混乱しています。 私は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> 

コメント解除ボタンペインゲインフォーカスを行い、逆もまた同様です。

+0

ないボタンを追加するとペインにフォーカスを与え、またはなぜ 'pane.requestFocus()'(あなたはそれが答えを得るために[MCVE]を投稿する必要があります)動作しなかった理由を確認してください。これを行う最善の方法は、シーンを作成する場所で行うことができる、シーンにリスナーを登録することです。その時点でコントローラへの参照も取得できるはずです。ハンドラからコントローラ上のメソッドを呼び出すことができます。 –

+0

できるだけ早くすべてのコードを投稿します。助けてくれてありがとう。また、私はinitialize()メソッドでrequestFocusを呼びました。おそらくそれがなぜ機能しなかったのでしょうか? – Random

+0

@James_D私はコード全体を投稿しました。あなたが見てもらえれば嬉しいです^^ – Random

答えて

0

これは、このサイト上で私の最初の答えであるので、私はあなたに答える非常に良くないかもしれません。

とにかく、私はこのエラーがのペインにイベントを適用していると考えて、シーンに適用してみてください。

EDITpane.getScene()を使用しています。あなたはシーンオブジェクトを持っていませんか?

+0

私はペインがフォーカスを持っていないことを知っています、なぜ私はフォーカスを要求したのか、それは何の仕事もありませんでした。それをシーンに適用するとうまくいくだろうが、なぜImがボタンを追加して作業を始めたのだろうと思っているのだろうか。 – Random

+0

ボタンの作成前後にペインの内容を印刷してみます。あなたがボタンを作成するまでシーンが実際には初期化されていない可能性があります。 –

+0

関連する問題