我在JavaFX中有一个带.FXML文件的应用程序,我在场景中添加了一个按钮。然后我尝试添加加速器,但是当它启动时会抛出NullPointerException。为什么它不起作用以及如何解决这个问题。
@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" />
我正在加载.fxml作为主场景的一部分。我是通过这段代码来做的。
try {
panel = FXMLLoader.load(getClass().getResource("Notes.fxml"));
} catch (IOException ex) {
showErrorDialog ....;
}
rightPanel.getChildren().add(panel);
mainPanel.setRight(rightPanel);
答案 0 :(得分:4)
正如user714965提到的那样,您的场景尚未完全构建,因此addQuickNote.getScene()
为null
。
另一种解决方案可能是这样的:
@Override
public void initialize(URL url, ResourceBundle rb) {
Platform.runLater(() -> {
addQuickNote.getScene().getAccelerators().put(new KeyCodeCombination(KeyCode.Q, KeyCombination.SHORTCUT_DOWN), () -> {
addQuickNote.fire();
});
});
}
答案 1 :(得分:3)
我认为addQuickNote.getScene()
为null
,因为此时您的控件尚未完全初始化,并且Button没有设置Scene
。
通过不在addQuickNote.getScene().getAccelerators()...
方法中调用initialize
来解决此问题。在main
- 方法中进行Controller初始化后,再次调用控制器,调用初始化加速器的方法。
编辑:
您的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();
}