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

JavaFX-如何在fxml控制器初始化期间设置值

赫连骏
2023-03-14

我尝试加载一个FXML,并使用Java代码(而不是使用FXML标记)设置控制器。我在FXML中有不同的字段。我尝试加载(例如文本字段、按钮...)。

下面是一个例子:

Tab tab = new Tab();
tab.setText("TesetTabAdd");
tabpane.getTabs().add(tab);
FXMLLoader loader = new FXMLLoader(getClass().getResource("tab.fxml"));
TabController tabCont = new TabController();
tabCont.setName("Sandro");
loader.setController(tabCont);
try {
   tab.setContent((Node)loader.load(getClass().getResource("tab.fxml")));
} catch (IOException ex) {
   System.out.println(ex);
}

如您所见,我创建了一个新的选项卡,为它设置文本,将它添加到tabpane,加载fxml,然后创建一个新的控制器,并将其设置为fxml的控制器。之后,我尝试在初始化之前在fxml中设置一个值,以便在控制器中使用它来更新文本字段或按钮。

这是我的控制器,我试图设置:

public class TabController implements Initializable {

    @FXML private TextField name;
    private final StringProperty nameProp = new SimpleStringProperty();

    public String getNameProp() {
        return nameProp.get();
    }

    public void setNameProp(String value) {
        nameProp.set(value);
    }

    public StringProperty namePropProperty() {
        return nameProp;
    }

    public void setName(String name){
        nameProp.setValue(name);
    }

    public String getName(){
        return nameProp.get();
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        name.textProperty().bind(nameProp);
    }    
}

我对createTab()方法进行了一小段编辑。这里我设置了控制器,然后使用setName方法。但是textfield不显示任何内容。system.out.println(tabcont.getname());方法打印出“sandro”!!!

public void createTab(){
        try{
        Tab tab = new Tab();
        tab.setText("TesetTabAdd");
        tabpane.getTabs().add(tab);
        FXMLLoader loader = new FXMLLoader();
        TabController tabCont = new TabController();
        loader.setController(tabCont);
        tabCont.setName("Sandro");
        tab.setContent((Node)loader.load(getClass().getResource("tab.fxml")));
        System.out.println(tabCont.getName());
        } catch (IOException ex) {
            System.out.println(ex);
        }
    }

共有1个答案

邹华池
2023-03-14

1)在调用load()方法之前,不会加载FXML文件。
(按照您的注释“...load the FXML,然后我创建一个新的控制器...”)。因此,仅仅启动FXMLLoader不会加载给定的FXML文件。

2)您调用了错误的加载方法。您应该使用实例化的FXMLLoader的加载方法。但您使用的是FXMLLoader类的静态加载方法。此静态版本将忽略通过setController()设置的控制器类。请尝试:

FXMLLoader loader = new FXMLLoader(getClass().getResource("tab.fxml"));
TabController tabCont = new TabController();
tabCont.setName("Sandro");
loader.setController(tabCont);
try {
   tab.setContent((Node) loader.load());
} catch (IOException ex) {
   System.out.println(ex);
}
 类似资料:
  • 问题内容: 我的课看起来像这样: 在FXMLLoader创建相应的控制器(在所给出的实例经由文件通过调用第一默认构造,然后)方法: 输出为: 那么,为什么存在这种方法呢?使用构造函数或方法初始化控制器所需的东西有什么区别? 问题答案: 简而言之:首先调用构造函数,然后@FXML填充所有带注释的字段,然后再调用。因此,构造函数无权访问引用文件中定义的组件的字段,而有权访问它们。 引用FXML简介:

  • 我的类如下所示: 通过首先调用默认构造函数,然后调用方法,创建相应控制器的实例(在文件中通过给出): 输出为: 那么,为什么方法会存在呢?使用构造函数或方法初始化控制器所需的东西有什么区别? 谢谢你的建议!

  • 我想从我的控制器类中处理阶段事件(即隐藏)。所以我所要做的就是添加一个这样的侦听器: 但问题是初始化在该代码之后立即开始: 在此代码之前: 因此,getScene返回null。 我自己找到的唯一解决方法是将侦听器添加到,当它变得不为空时,我得到场景,将我最终检索阶段的侦听器处理添加到它的中。这一切都以将所需的侦听器设置为阶段事件而结束。 我觉得听众太多了。 这是解决我问题的唯一方法吗?

  • 正如标题所述,在构建表并将所有内容添加到表中的initialize方法和FXMLLoader之间存在一定的冲突,FXMLLoader应该为弹出窗口加载FXML。 我的代码: 主要内容: FXML 1。 控制器。 Fxml2: 问题是:如果你删除初始化或注释它-Neu按钮弹出-工作,如果没有-表格显示,但按钮弹出没有,似乎有冲突

  • 我看了这个,这个,还有这个,但遗憾的是,没有一个能解决我的问题。组件总是空的。ID是一样的,但我仍然不知道我做错了什么。下面是我的代码: 应用类。 RootView.fxml 控制器类 应用程序运行正常。我错过了什么吗?

  • 我有一个Spring MVC,它使用一个外部库,我无法访问代码。此外部库使用标准system.get属性调用读取某些属性。我必须在使用服务之前设置这些值。 由于我的应用程序是SpringMVC应用程序,我不确定如何初始化这些属性。这是我到目前为止所做的,但由于某些原因,我认为这些值总是空的。 我将属性放在属性文件 然后,我在我的应用程序中添加了以下两行ontext.xml 我阅读了文档,为了设置初