2017-02-07 12 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 Пожалуйста, отметьте ответ как правильный, если он ответит на вопрос. –