2013-10-26 42 views
3

我有FXML和keyPress處理程序的問題。JavaFX FXML控制器密鑰處理程序代碼不起作用

我嘗試設置按鍵按下簡單測試,但沒有調用按鍵處理程序。鼠標處理等工作正常,但密鑰處理沒有。

我試圖setneHandler窗格上,圓(窗格)和場景。

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"); 
      } 
     }); 
    } 
} 

尊敬語,THX你的答案,但我希望做了一些「遊戲」,其中對窗格簡單的圓形,上keybord移動通過壓。當然,重點關注組件將起作用。但沒有重點。也許關鍵聽衆必須設置在窗口或場景?我對目的的模糊性表示歉意。

我試圖按下按鈕,但在初始化中,scence爲空。

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類設置。在應用程序上設置密鑰處理程序,它的工作!但是,如何讓圓和現場的其他成分,becouse他們controlle.class

@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(); 
    } 

現在,我係有李宗紅/母根的查找

是做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方法以獲得Circle(例如:getCircle())。使用getController API從fxmlLoader獲取控制器。然後使用getCircle方法可以得到圓。 – Dil

回答

5

你的代碼沒有問題。我測試了這段代碼,它對我沒有任何改變。問題可能與您的使用有關。爲什麼要將KeyPress偵聽器添加到整個窗格而不是某些組件?除非未選中容器/窗格,否則無法識別按鍵。 添加一個文本字段中FXML非常如果按鍵的購買價款作爲

@FXML 
private TextField testTextField; 

,並添加以下代碼中初始化()函數

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添加文本字段此外,不只是在控制器中添加上面的代碼。