2017-10-10 4 views
0

教育目的のために、javafxアプリケーションにホットキーを追加しようとしています。サンプルコードを使用して、ホットキーで自分のラベルにアクセスできません。ボタンを使って、ラベルをうまく更新するのと全く同じメソッドを呼び出すことができます。ホットキーでラベルを更新するときのJavafx NPE

ビュー:

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<AnchorPane id="AnchorPane" prefHeight="62.0" prefWidth="91.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fx.probleme.SampleViewController"> 
    <children> 
     <Label id="label" fx:id="label" layoutX="14.0" layoutY="45.0" text="Label" /> 
     <Button layoutX="20.0" layoutY="14.0" mnemonicParsing="false" onAction="#updateText" text="Button" /> 
    </children> 
</AnchorPane> 

とコントローラ:その段階でLabelが初期化されていないため

package fx.probleme; 

import javafx.application.Application; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.input.KeyCode; 
import javafx.scene.input.KeyEvent; 
import javafx.stage.Stage; 

public class SampleViewController extends Application { 

    @FXML 
    Label label; 

    @FXML 
    void updateText() { 
     label.setText(label.getText() + "+"); 
    } 

    @Override 
    public void start(Stage stage) throws Exception { 
     Parent parent = FXMLLoader.load(this.getClass().getResource("SampleView.fxml")); 
     Scene scene = new Scene(parent); 
     scene.setOnKeyPressed((final KeyEvent keyEvent) -> { 
      if (keyEvent.getCode() == KeyCode.NUMPAD0) { 
       updateText(); 
      } 
     }); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

答えて

0

あなたはNullPointerExceptionを取得するには、初期化がinitializeで行われます。 まず、メインクラスをコントローラクラスと混合した後、コントローラをimplements Initializableに設定した後、initializeメソッドの後にコントローラのすべてのコンポーネントを呼び出すことができます@FXMLによって初期化されます。あなたの場合、開始メソッドはまだ初期化されていません。また、シーンのメソッドを使用したくない場合もありますが、コンテンツパネルにイベント、アクションを追加できます(AnchorPane)。

コントローラクラスとメインクラスを分けて、Initializableを実装することをお勧めします。これは、アプリケーションに対してより優れたビジョンを持つのに役立ちます。コンポーネントがどこで初期化されているか、NPEなしでメソッドを使用することは確実ですか?

、あなたがボタンのために行ったように、あなたがonKeyPressedにメソッドを追加することができ、.fxmlファイルにAnchorPaneためfx:idを追加することができます(推奨)別のクラスでそれを行うにはしたくない場合。

+0

お返事ありがとうございます。私はjavafx自身を教えていて、 'Application'クラスは' Controller'クラスではないことを学んでいます。あなたの前にonKeyPressedイベントを使用してあなたのヒント。内容ペインも有効ですが、私は正しい方法で行うために 'Controller'と' Application'を分離します。他の読者:なぜ私はこれらの優れた説明をなぜ分離するのか分かりました: https://stackoverflow.com/questions/33303167/javafx-can-application-class-be-the-controller-class –

関連する問題