6

我在 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);
4

2 回答 2

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();
        });
    });
}
于 2015-04-12T21:03:23.730 回答
3

我猜那addQuickNote.getScene()null因为此时您的控件尚未完全初始化,而 Button 只是没有Scene设置。

通过不调用方法来解决这个addQuickNote.getScene().getAccelerators()...问题initialize。在您的main-method 中的 Controller-initialization 之后,再次调用您的控制器以调用您正在初始化加速器的方法。


编辑:您的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();
}
于 2013-05-26T18:14:52.697 回答