2017-04-08 70 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

除了