2016-08-24 94 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

包聲明在那裏,但它不是問題。我註釋了我的原始帖子,以顯示我失蹤的內容。 – 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