JavaFX中按钮的加速器
我在JavaFX中有一个带有.FXML文件的应用程序,我在场景中添加了一个按钮。然后我尝试向它添加加速器,但当它启动时抛出NullPointerException。为什么它不起作用以及如何解决这个问题JavaFX中按钮的加速器,java,javafx-2,Java,Javafx 2,我在JavaFX中有一个带有.FXML文件的应用程序,我在场景中添加了一个按钮。然后我尝试向它添加加速器,但当它启动时抛出NullPointerException。为什么它不起作用以及如何解决这个问题 @FXML Button addQuickNote; @FXML public void handlequickNote(ActionEvent e) { String text = SampleController.getSelectedText()
@FXML
Button addQuickNote;
@FXML
public void handlequickNote(ActionEvent e) {
String text = SampleController.getSelectedText();
if (text != null) {
SampleController.profileManager.insertNote(DataParser.getNote(text));
}
}
@Override
public void initialize(URL url, ResourceBundle rb) {
addQuickNote.getScene().getAccelerators().put(new KeyCodeCombination(KeyCode.Q, KeyCombination.SHORTCUT_DOWN), new Runnable() {
@Override
public void run() {
addQuickNote.fire();
}
});
}
我的.fxml非常复杂,因为它包含我的应用程序的整个模块,所以我只粘贴了一行按钮。该按钮位于工具栏中
<Button fx:id="addQuickNote" mnemonicParsing="false" onAction="#handlequickNote" prefWidth="77.0" text="Z tekstu" />
我猜
addQuickNote.getScene()
是null
,因为此时您的控件没有完全初始化,并且按钮没有设置Scene
通过不在初始化
方法中调用addQuickNote.getScene().getAccelerators()…
来解决此问题。在main
-方法中初始化控制器后,对控制器执行另一个调用,以调用正在初始化加速器的方法
编辑: 您的
start
方法似乎不完整。它必须看起来像这样:
@Override
public void start(Stage primaryStage) throws IOException {
FXMLLoader loader = new FXMLLoader();
AnchorPane page = (AnchorPane) loader.load(getClass().getResourceAsStream("MainScene.fxml"));
Scene scene = new Scene(page);
MainSceneController controller = loader.getController();
controller.initializeAccelerators();
primaryStage.setScene(scene);
primaryStage.show();
}
@Override
public void initialize(URL url, ResourceBundle rb) {
Platform.runLater(() -> {
addQuickNote.getScene().getAccelerators().put(new KeyCodeCombination(KeyCode.Q, KeyCombination.SHORTCUT_DOWN), () -> {
addQuickNote.fire();
});
});
}
由于用户714965提到结束,您的场景尚未完全构建,因此
addQuickNote.getScene()
为null
。
另一种解决方案可能是这样的:
@Override
public void start(Stage primaryStage) throws IOException {
FXMLLoader loader = new FXMLLoader();
AnchorPane page = (AnchorPane) loader.load(getClass().getResourceAsStream("MainScene.fxml"));
Scene scene = new Scene(page);
MainSceneController controller = loader.getController();
controller.initializeAccelerators();
primaryStage.setScene(scene);
primaryStage.show();
}
@Override
public void initialize(URL url, ResourceBundle rb) {
Platform.runLater(() -> {
addQuickNote.getScene().getAccelerators().put(new KeyCodeCombination(KeyCode.Q, KeyCombination.SHORTCUT_DOWN), () -> {
addQuickNote.fire();
});
});
}
您是否也可以显示您的.fxml?请确保addQuickNote链接为fxml文件中的按钮fx:id addQuickNote链接为fxml文件中的按钮fx:id。我已经测试了解决方案,但仍然存在相同的异常。也许我做错了什么。我正在加载.fxml作为主场景的一部分。请参阅有问题的代码。谢谢,我最喜欢这个解决方案(在这里和其他线程中)。虽然使用Platform.runLater()@Denis不依赖runLater,但它有点“黑客化”——具体运行时间尚未确定!相反,请侦听节点的sceneProperty,并在该侦听器中安装所有与场景相关的内容