2017-04-08 12 views
0

나는 지금 당황하고있다. fxml 코드에서 창을 만들고 onKeyPressed 이벤트를 설정했습니다.KeyEvents and Focus JavaFX

pane.setOnKeyPressed(new EventHandler<KeyEvent>() { 
    @Override 
    public void handle(KeyEvent event) { 
     System.out.println("I'm here"); 
     jump(event); 
    } 
}); 

이것은 작동하지 않았습니다. 창은 어떤 KeyEvents도 잡지 않았습니다. 절대로 "나는 여기있다"라고 인쇄하지 않았습니다. 그런 다음 장면의 onKeyPressed를 설정하고 싶었지만 컨트롤러에서 수행해야하는 작업은 키 누르기 중에 처리해야하는 작업이 컨트롤러에서 수행되어야하므로 컨트롤러에서 수행해야합니다.

그런 다음 pane.getScene().setOnKeyPressed()이라고했는데 nullPointerException이라고 말하면서 제가 initialize() 밖에 전화해야한다는 것을 알았습니다.

그래서 Button을 만들고 onAction 이벤트를 첨부하여 내 창 장면을 인쇄하여 실제로 작동하는지 확인합니다.

@FXML 
public void printScene() { 
    System.out.println(pane.getScene()); 
} 

단추를 클릭하면 내 창 장면이 인쇄되어 있어야합니다. 그런데 내 창은 이제 KeyEvents를 잡는 것을 깨달았습니다. Fxml을 사용하여 버튼을 추가하는 것을 제외하고는 아무것도 변경하지 않았으며 이제 창은 KeyEvents를 잡아 냅니까? I 버튼에 대한 코드를 주석 때, 창은이 내가 버튼이있는 모든 코드는 더 이상

<Button onAction="#printScene"/> 

KeyEvents를 잡을 수 없습니다.

참고 : 또한 작동하지 않는 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

이것은이 사이트에 대한 나의 첫 번째 답변이므로 응답이 좋지 않을 수 있습니다.

어쨌든 오류는 입니다.이 이벤트는 창에 적용한 후 장면에 적용 해보십시오.

편집 : pane.getScene(); 장면 개체가 없습니다.

+0

나는 창문에 초점이 없다는 것을 알고있다. 장면에 적용하면 효과가 있지만 Im이 궁금해하는 이유는 Button을 추가하는 것입니다. – Random

+0

버튼 생성 전후에 창 내용을 인쇄 해보십시오. 단추를 만들 때까지 장면이 실제로 초기화되지 않았을 수도 있습니다. –

+0