2013-10-26 2 views
3

FXML 및 keyPress 처리기에 문제가 있습니다.JavaFX FXML 컨트롤러 키 처리기 코드가 작동하지 않습니다.

키 누름 간단한 테스트를 설정하려고하지만 키 핸들러가 호출되지 않습니다. 마우스 조작 등은 올바르게 작동하지만 키 처리에는 문제가 없습니다.

나는 창, 원 (창에서) 및 장면에 setKeyHandler를 시도했다.

public class Controller implements Initializable { 
    public Pane canvas; 
    public Label yDisplay; 
    public Label xDisplay; 
    public Circle circle; 

    @Override 
    public void initialize(URL url, ResourceBundle resourceBundle) { 
     canvas.setOnKeyPressed(new EventHandler<KeyEvent>() { 
      @Override 
      public void handle(KeyEvent keyEvent) { 
       System.out.println("Test"); 
      } 
     }); 
    } 
} 

는 DIL, 당신의 답변을 들으 존경,하지만 난 창에 간단한 원, 키 보즈 언론 이동 일부 "게임"을했다합니다. 물론, compmonent에 초점을 맞추면 효과가 있습니다. 그러나 초점은 없습니다. 어쩌면 창이나 장면에 키 수신기를 설정해야할까요? 목적의 모호함에 대해 사과드립니다.

언론에서 설정하려했지만 초기화에서 scence가 null입니다.

public class Controller implements Initializable { 
    @FXML private Pane canvas; 
    @FXML private Label yDisplay; 
    @FXML private Label xDisplay; 
    @FXML private Circle circle; 

    @Override 
    public void initialize(URL url, ResourceBundle resourceBundle) { 
     canvas.getScene().setOnKeyPressed(new EventHandler<KeyEvent>() { 
      @Override 
      public void handle(KeyEvent keyEvent) { 
       System.out.println("Work"); 
      } 
     }); 
     canvas.setOnMousePressed(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent mouseEvent) { 
       canvas.getChildren().add(new Bullet(150.0, 150.0, mouseEvent.getX(), mouseEvent.getY())); 
      } 
     }); 
    } 
} 

그것은 논리, 그리고 내가 Apllication 클래스에서 설정했습니다. 응용 프로그램에서 키 처리기를 설정하면 작업이 완료됩니다! 그러나, 어떻게 얻을 서클 장면의 다른 구성 요소, 그들은 지금 난에서 scence/학부모 루트의 조회

예와 함께 할 공동

@Override 
    public void start(Stage primaryStage) throws Exception { 
     Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); 
     primaryStage.setTitle("Hello World"); 
     primaryStage.setScene(new Scene(root)); 
     primaryStage.getScene().setOnKeyPressed(new EventHandler<KeyEvent>() { 
      @Override 
      public void handle(KeyEvent keyEvent) { 
       System.out.println("HEY"); 
      } 
     }); 
     primaryStage.show(); 
    } 

controlle.class

에 kepp 렸기 때문에! 학부모의 조회는 업무입니다. # + "id"로 검색해야합니다.

@Override 
    public void start(Stage primaryStage) throws Exception { 
     Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); 
     primaryStage.setTitle("Hello World"); 
     primaryStage.setScene(new Scene(root)); 
     primaryStage.getScene().setOnKeyPressed(new EventHandler<KeyEvent>() { 
      @Override 
      public void handle(KeyEvent keyEvent) { 
       System.out.println("HEY"); 
       Circle myCirecle = (Circle) root.lookup("#circle"); 
       myCirecle.setTranslateY(10.0); 
      } 
     }); 
     primaryStage.show(); 
    } 
+1

룩업을 사용하여 원을 얻을 수 있지만이를 수행하는 표준 방법이 있습니다. 서클을 가져 오기 위해 getter 메소드를 컨트롤러에 작성하십시오 (예 : getCircle()). getController API를 사용하여 fxmlLoader에서 컨트롤러를 가져옵니다. 그런 다음 getCircle 메소드를 사용하여 원을 얻을 수 있습니다. – Dil

답변

5

코드에는 문제가 없습니다. 코드 조각을 테스트 한 결과 아무런 변화없이 저에게 효과적이었습니다. 문제가 귀하의 사용에있을 수 있습니다. 왜 KeyPress Listener를 일부 구성 요소가 아닌 전체 창에 추가하고 있습니까? 컨테이너/창을 선택하지 않으면 키 누름이 인식되지 않습니다. fxml에서 텍스트 필드 추가는 매우 키 누름() 함수를

testTextField.setOnKeyPressed(new EventHandler<KeyEvent>() { 

     @Override 
     public void handle(KeyEvent arg0) { 
      // TODO Auto-generated method stub 
      System.out 
        .println("MyController.initialize().new EventHandler() {...}.handle()"); 

     } 
    }); 

참고

@FXML 
private TextField testTextField; 

아래로 인식하고 내부 초기화 코드 아래에 추가되는 경우 : 당신은 fxml에서 텍스트 필드를 추가해야합니다 또한 컨트롤러에 위의 코드를 추가하는 것이 아닙니다.

관련 문제