2017-02-07 1 views
1

이것은 내 코드입니다. 이 프로그램을 실행하면 일반 장면, 일반 창 및 일반 단추가 나타납니다. 왼쪽 상단 모서리의 버튼을 클릭하면 반경이 90 픽셀 인 450, 450 좌표에 원이 나타납니다. 그러나 내 키보드를 사용하여 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 질문에 대답하는 경우 대답을 올바른 것으로 표시하십시오. –

관련 문제