2017-04-08 68 views
0

我現在超級困惑。 我已經在fxml代碼中創建了一個窗格並設置了一個onKeyPressed事件。KeyEvents和焦點JavaFX

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

這沒有奏效。窗格沒有捕獲任何KeyEvent。從不打印「我在這裏」。 然後,我想設置場景的onKeyPressed,這是可行的,但我必須在控制器中進行,因爲我想在按鍵過程中處理的事情必須在Controller中完成。

然後我打電話給pane.getScene().setOnKeyPressed()但是給了nullPointerException,因爲我發現我不得不叫initialize()以外。

所以我創建了一個按鈕和一個附加事件的OnAction給它,它打印出我的窗格的場景,嘗試,如果它確實有效。

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

當我點擊按鈕時,它打印出我的窗格的場景,因爲它應該有。但是後來,我意識到我的窗格現在捕獲了KeyEvents。除了使用Fxml添加按鈕以外,我什麼都沒有改變,現在窗格捕獲KeyEvents?當我註釋掉該按鈕的代碼時,該窗格不再捕獲KeyEvents

<Button onAction="#printScene"/> 

這是我爲按鈕使用的所有代碼。

注意:我也試過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

我知道窗格並沒有重點,這就是爲什麼我要求重點,這沒有奏效。在場景中應用它會有用,但是我想知道爲什麼它開始使用Button的工作。 – Random

+0

嘗試在創建按鈕之前和之後打印窗格內容。也許在創建按鈕之前,場景並未真正初始化。 –

+0

除了