6

.FXML ファイルを使用した JavaFX のアプリがあり、シーンにボタンを追加します。次に、アクセラレータを追加しようとしましたが、起動すると 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()と思います。nullScene

メソッドを呼び出さないことaddQuickNote.getScene().getAccelerators()...でこれを解決しinitializeます。main-methodでコントローラーを初期化した後、アクセラレーターを初期化するメソッドへのコントローラーへの別の呼び出しを行います。


編集:あなたの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 に答える