2016-08-31 4 views
0

私はアプリケーションが起動するとデータでいっぱいにする必要があるTableViewを持つJavaFXアプリケーションを持っています。JavaFX 8でTableViewの作成をキャッチする方法

@FXML Parent myRoot; 
@FXML TableView datTable<DataClass>; 

private Stage theStage; 

public EventHandler<WindowEvent> windowStarted = event -> { 
    theStage = (Stage)myRoot.getScene().getWindow(); 
    getData(); 
}; 

protected void getData() 
{ 
    dataTable.setEditable(false); 
      . 
      // Call a SOAP service to get the data 
      . 
} 

:それが起動したら、それは(最初は)一部の列を作成するように私はテーブルビューオブジェクトを持って、私のコントローラで

private LayoutController theController; 

@Override 
public void start(Stage primaryStage) 
{ 
    try { 
    FXMLLoader fxmlload = new FXMLLoader(getClass().getResource("Sample.fxml")); 
    BorderPane root = (BorderPane)fxmlload.load(); 

     Scene scene = new Scene(root,640,480); 
     scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 
    theController = (LayoutController)fxmlload.getController(); 

    primaryStage.setTitle("Title Application"); 
    primaryStage.addEventHandler(WindowEvent.WINDOW_SHOWN,theController.windowStarted); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

、SampleControllerと呼ばれる:私は、次のようにアプリケーションを起動しています私はステージのWINDOW_SHOWNイベントが発生すると、コントロールが作成され、私はそれらで何かできると仮定していました。それは明らかにそうではありません。どうやら、FXMLを使って指定されたコントロールは、実際にはのメインアプリケーションウィンドウが作成された後にに作成されます。

windowStartedラムダが実行されると、getData()メソッドが呼び出されますが、WINDOW_SHOWNイベントが発生する前にdataTableが作成されていないようです。その結果、dataTableのメソッドのいずれかを呼び出そうとすると、NullPointerExceptionのエラーが発生します。

私はそのメソッドを使用できるように、dataTableが実際に作成されたときに捕捉する必要があります。これを行うにはいくつかの方法がありますか?誰かが助言してください

...

+0

'@FXML TableView datTable ;': "datTable"。そして、それを 'dataTable'として使います。これはタイプミスですか?これはどのようにしてコンパイルされますか?そうでない場合、おそらくFXMLファイルの 'fx:id'属性が(正しく)設定されていない可能性があります。 – DVarga

答えて

1

は、すべてのFXMLフィールドが割り当てられた後にそのルート要素が完全に処理された後、または他の言葉でコントローラ上で呼び出されるメソッドinitialize内のデータのダウンロードのためにあなたのコードを入れてください。

@FXML 
public void initialize() { 
    //Here! 
} 
+0

お返事ありがとうございます。 1つの質問:コントローラにinitialize()関数をどのように関与させるのですか?コントローラーに入れるだけでコントローラーが呼び出されることはなく、コントローラーや初期化関数に関連付けることができるルート要素に関連するイベントはないようです(キーボード、マウス、および他の入力イベント)。 –

+0

コントローラが呼び出すために実装できる初期化可能なインターフェイスがありましたが、FXMLLoaderはこのメソッドを自動的に呼び出します。 doc:https://docs.oracle.com/javase/8/javafx/api/javafx/fxml/Initializable.htmlへのリンク – pr0gramist

+1

はい、そうです。残念ながら、WINDOW_SHOWNイベントのようなinitialize()メソッドは、dataTableが作成される前に*呼び出されます。その結果、dataTableはそのメソッドを呼び出そうとするとまだNULLです。 initilizeメソッドを追加しても何も変わりません。 –

関連する問題