2014-11-14 62 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 
    } 

} 
相关问题