2017-02-07 10 views
1

これは私のコードです。このプログラムを実行すると、通常のシーン、通常のペイン、通常のボタンが表示されます。左上隅のボタンをクリックすると、座標450×450、半径90ピクセルの円が表示されます。しかし、キーボードを使用して10ピクセル分の円を動かそうとすると、私は何の変化も見ません。また、私はプログラムを実行するときに例外を見ません。javafxのボタンの中からキーイベントを取得する方法

Pane p = new Pane(); 
    Button b = new Button("Clickable"); 
    Circle c = new Circle(450, 450, 90, Color.RED); 
    c.setVisible(false); 
    EventHandler<ActionEvent> e = s -> { 
     c.setOnKeyPressed(g -> { 
      if(g.getCode() == UP) {c.setCenterY(c.getCenterY() + 10);} 
      if(g.getCode() == DOWN) {c.setCenterY(c.getCenterY() - 10);} 
      if(g.getCode() == RIGHT) {c.setCenterX(c.getCenterX() + 10);} 
      if(g.getCode() == LEFT) {c.setCenterX(c.getCenterX() - 10);} 
     }); 
     c.setVisible(true); 
    }; 
    b.setOnAction(e); 
    p.getChildren().addAll(b, c); 
    Scene s = new Scene(p, 900, 900); 
    stage.setScene(s); 
    stage.show(); 
    c.requestFocus(); 

答えて

1

私は、表示されていないノードがキーボードフォーカスを取得できるとは思わない。可能であれば、ユーザーがボタンをクリックすると、キーボードフォーカスがボタンに転送されます。あなたは、ボタンが押された後の円にフォーカスを置く必要があります。

Pane p = new Pane(); 
Button b = new Button("Clickable"); 
Circle c = new Circle(450, 450, 90, Color.RED); 
c.setVisible(false); 
EventHandler<ActionEvent> e = evt -> { 
    c.setOnKeyPressed(g -> { 
     if(g.getCode() == UP) {c.setCenterY(c.getCenterY() + 10);} 
     if(g.getCode() == DOWN) {c.setCenterY(c.getCenterY() - 10);} 
     if(g.getCode() == RIGHT) {c.setCenterX(c.getCenterX() + 10);} 
     if(g.getCode() == LEFT) {c.setCenterX(c.getCenterX() - 10);} 
    }); 
    c.setVisible(true); 
    c.requestFocus(); 
}; 
b.setOnAction(e); 
p.getChildren().addAll(b, c); 
Scene s = new Scene(p, 900, 900); 
stage.setScene(s); 
stage.show(); 

それはシーンにイベントハンドラを登録するには、あなたの正確な要件に応じて、全体的に良いかもしれない:

Pane p = new Pane(); 
Scene s = new Scene(p, 900, 900); 
Button b = new Button("Clickable"); 
Circle c = new Circle(450, 450, 90, Color.RED); 
c.setVisible(false); 
EventHandler<ActionEvent> e = evt -> { 
    s.setOnKeyPressed(g -> { 
     if(g.getCode() == UP) {c.setCenterY(c.getCenterY() + 10);} 
     if(g.getCode() == DOWN) {c.setCenterY(c.getCenterY() - 10);} 
     if(g.getCode() == RIGHT) {c.setCenterX(c.getCenterX() + 10);} 
     if(g.getCode() == LEFT) {c.setCenterX(c.getCenterX() - 10);} 
    }); 
    c.setVisible(true); 
}; 
b.setOnAction(e); 
p.getChildren().addAll(b, c); 
stage.setScene(s); 
stage.show(); 
+0

感謝これは完全にうまくいった – IbrahimLikeJava

+0

@ user7341000質問に答えた場合は、正しいとマークしてください。 –

関連する問題