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

时间:2015-10-28 09:15:16

标签: java user-interface javafx

我尝试加载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);
}

如您所见,我创建了一个新Tab,为其设置文本,将其添加到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方法。但我文本字段不显示任何东西。 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 个答案:

答案 0 :(得分:3)

1)在调用load()方法之前,不会加载FXML文件 (根据你的评论“... load the fxml and then I create a new controller ...”)。因此,只需启动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);
}