Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX中按钮的加速器_Java_Javafx 2 - Fatal编程技术网

JavaFX中按钮的加速器

JavaFX中按钮的加速器,java,javafx-2,Java,Javafx 2,我在JavaFX中有一个带有.FXML文件的应用程序,我在场景中添加了一个按钮。然后我尝试向它添加加速器,但当它启动时抛出NullPointerException。为什么它不起作用以及如何解决这个问题 @FXML Button addQuickNote; @FXML public void handlequickNote(ActionEvent e) { String text = SampleController.getSelectedText()

我在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" />

我猜
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,并在该侦听器中安装所有与场景相关的内容