2016-08-24 7 views
1

これはパイロットエラーですが、FXML属性がfx:idのコントローラクラスにバインドされていません。私はそれを簡単な例に変えましたが、それでも "喜びはありません"。私は何を見落としていますか?JavaFx要素がfx:idのコントローラ変数にバインドしていません

FXMLファイル...

<?xml version="1.0" encoding="UTF-8"?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.layout.BorderPane?> 

<BorderPane fx:id="mainFrame" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.controller.BorderPaneCtrl"> 
    <left> 
    <AnchorPane fx:id="anchorPaneLeft" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" /> 
    </left> 
</BorderPane> 

関連するJavaコードがある...

package sample.controller; 

import javafx.fxml.FXML; 
import javafx.scene.layout.AnchorPane; 

public class BorderPaneCtrl { 
    @FXML private AnchorPane anchorPaneLeft; 

    public BorderPaneCtrl() { 
     /* so, @FXML-annotated variables are accessible, but not 
     * yet populated 
     */ 
     if (anchorPaneLeft == null) { 
      System.out.println("anchorPaneLeft is null"); 
     } 
    } 

/* this is what was missing...added for "completeness" 
*/ 
@FXML 
public void initialize() { 
    /* anchorPaneLeft has now been populated, so it's now 
    * usable 
    */ 
    if (anchorPaneLeft != null) { 
     // do cool stuff 
    } 
} 

自我は、私はシンプルなものを望むよかなり確信している、ここでの問題ではありません。

+1

私はあなた 'BorderPaneCtrl'クラスのパッケージが表示されません。 FXMLファイルには、 'sample.controller.BorderPaneCtrl'があります –

+0

packageステートメントはありますが、それは問題ではありませんでした。元の投稿に注釈を付けて、私が見逃していたことを示しました。 – SoCal

答えて

1

FXML要素はまだコンストラクタに割り当てられていませんが、要素がすでに割り当てられているInitializableインターフェイスを使用できます。

public class Controller implements Initializable { 
    @FXML 
    AnchorPane anchorPaneLeft; 

    public Controller() { 
     System.out.println(anchorPaneLeft); //null 
    } 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     System.out.println(anchorPaneLeft); //AnchorPane 
    } 
} 

私はあなたが例えば使用してFXMLとコントローラーを作成する必要があることを知っていることを前提としていますFXMLLoader.load(getClass().getResource("sample.fxml");

+0

これまでの質問(このスレッドの先頭で参照されています)は問題を正しく解決しています。 Initializableを実装する必要はありませんが、コンストラクタが呼び出されるまで、バインドされた変数には値が設定されないため、FXMLアノテーション付きの初期化が必要です。 Grazi ... – SoCal

関連する問題