2014-11-14 60 views
2

我加載一個FXML文件中的下列方式如何訪問JavaFX組件在控制器的構造函數

 FXMLLoader loader = new FXMLLoader(getClass().getResource("register.fxml")); 
     Controller c = new Controller("Welcome to EAST"); 
     loader.setController(c); 
     Scene scene = new Scene(loader.load()); 
     fx.setScene(scene); // fx is a JFXPanel which is used to integrate FX in Swing 

上面的代碼工作正常,現在我要訪問的textFields的默認值register.fxml在Controller類的構造函數中,但它給出了以下錯誤:線程「JavaFX Application Thread」中的異常java.lang.NullPointerException

注意:我已經給textFields分配了一些默認值,這就是我想要訪問它們的原因。

以下是我的控制器類

Controller.java

public class Controller { 

    @FXML 
    private TextField username; 
    @FXML 
    private PasswordField pass; 
    @FXML 
    private TextField ip; 
    @FXML 
    private TextField sPort; 
    @FXML 
    private TextField fPort; 

    public Controller(String str) { 
     System.out.println(str); 
     System.out.println(ip.getText()); // this line gives the NullPointerException Error 
    } 

    @FXML 
    private void login() { 

    } 

    @FXML 
    private void register(){ 

    } 

    @FXML 
    private void cancel(){ 
     System.exit(0); 
    } 
} 

任何建議,將不勝感激。謝謝:)

回答

0

FXMLLoader將開始加載並初始化loader.load()中的FX組件。在那一刻,它需要事件處理的控制器。所以如果你創建Controller(構造函數),FXML就不可用。

只有在FXML調用的事件方法中,才能訪問GUI組件。或者向控制器添加單獨的方法,如

public void init() { ... } 

在加載...訪問組件後調用。

+2

的'初始化()'(不'的init()')方法被調用自動成爲FXMLLoader一旦創建並注入所有的'@ FXML'註解領域。 –

+0

Thanx的提示! –

4

你不知道。在可以通過FXMLLoader注入控件之前,必須創建控制器實例。您在控制器中使用初始化方法而不是構造函數。

讓你的控制器執行https://docs.oracle.com/javafx/2/api/javafx/fxml/Initializable.html

或實施

class MyController { 

    @FXML 
    public void initialize(){ 
     //Will be called by FXMLLoader 
    } 

} 
相關問題