当前位置: 首页 > 知识库问答 >
问题:

如何在Controller Class的构造函数中访问JavaFX组件

吴俊风
2023-03-14

我用以下方法加载一个FXML文件

        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的默认值。fxml在控制器类的构造函数中,但它给出了一个错误:线程“JavaFX应用程序线程”java中的异常。lang.NullPointerException。

注意:我已经为文本字段分配了一些默认值,这就是为什么我想访问它们。

下面是我的控制器类

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);
    }
}

如有任何建议,将不胜感激。谢谢:)

共有2个答案

孔光赫
2023-03-14

FXMLLoader将开始加载并初始化loader中的FX组件。加载()。在那一刻,它已经需要控制器来处理事件。因此,如果创建控制器(构造函数),FXML将不可用。

只有在从FXML调用的事件方法中,才能访问GUI组件。或者向控制器添加一个单独的方法,如

public void init() { ... }

加载后调用。。。访问组件。

巫马翰翮
2023-03-14

不需要。在FXMLLoader注入控件之前,必须创建控制器实例。在控制器中使用初始化方法而不是构造函数。

让你的控制器实现https://docs.oracle.com/javafx/2/api/javafx/fxml/Initializable.html .

或实施

class MyController {

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

}
 类似资料:
  • 我一直不明白为什么我们能够从其他类调用一个类的构造函数。构造函数是一种方法,通常当试图从类中调用方法时,我们必须要么使该方法静态,这样我们就可以以 但是在构造函数的情况下,我们两者都不做。Java如何调用类的构造函数而不执行这些方法中的任何一个?我知道一个类的构造函数必须对你调用它的类可见,也就是说,如果你调用的类构造函数在不同的包中,你必须导入那个包。 那么,Java如何处理调用构造函数,而不必

  • 我想在构造函数中访问多个位置的状态值。当我在构造函数中输入console.log(this)时,我可以看到可以访问特定的值,但是当我输入console.log this.state时,我没有定义。 这就是我想象的工作方式(我想访问CSSValue中的状态): 但是,当我运行此代码: 然后我在控制台中得到这个: 但是当我将console.logconsole.log(this.state)它打印未定

  • 我有一个带有start方法的类,用于启动JavaFX的primaryStage。 但是,我有另一个名为change_screen(int n)的函数,它将根据传递给它的数字创建一个新场景,并为该新场景执行primarystage.setscene()和.show()。 如果我的方法是错误的,那么在同一个窗口中改变几个场景的正确方法是什么?

  • 本文向大家介绍详解C++中如何将构造函数或析构函数的访问权限定为private,包括了详解C++中如何将构造函数或析构函数的访问权限定为private的使用技巧和注意事项,需要的朋友参考一下 今天面试被问到了这个单例模式常用到的技术手段,下面进行分析:         很多情况下要求当前的程序中只有一个object。例如一个程序只有一个和数据库的连接,只有一个鼠标的object。通常我们都将构造函

  • 我正在创建一个程序,该程序获取用户的信息并输出最小值,最大值,平均值,总和,并计算其中有多少个值。我真的很难弄清楚如何创建100个项目的默认构造函数以及用户应该定义的数组大小。 > 创建新的数据集对象。创建对象的客户端指定可以添加到集中的最大项数。(编写一个具有一个 int 参数的构造函数。 还要编写一个默认构造函数,该构造函数创建一个能够处理100个项目的DataSet。 将整数数据项添加到数据

  • 我创建了一个日历应用程序,可以添加注释。为了实现添加注释的功能,我创建了一些父组件,它有自己的状态,然后传递给子组件。子组件应该在构造函数中接受来自执行的。但是,由于setState函数异步ChildComponent没有时间等待父母组件的道具。 如何设置ChildComponent的初始状态,等待父母组件的道具(换句话说,同步)? 父组件: ChildComponent: