Variables 具有多个FXML文件的变量

Variables 具有多个FXML文件的变量,variables,javafx,fxml,Variables,Javafx,Fxml,我有一个多场景JavaFXML应用程序 基于Angela Caicedo代码 我已将TextField添加到Scene2.fxml和Scene3.fxml每个场景都有一个文件 它自己的控制器类带有屏幕控制器类,该类使用 Idname,在ScreensFramework类(Main类)中定义的节点screen) 因此,每次单击屏幕(场景)上的按钮,都会触发一个动作事件 然后移到另一个屏幕 myController.setScreen(ScreensFramework.screen2ID); 如

我有一个多场景JavaFXML应用程序 基于Angela Caicedo代码

我已将
TextField
添加到
Scene2.fxml
Scene3.fxml
每个场景都有一个文件 它自己的
控制器
类带有
屏幕控制器
类,该类使用 Id
name
,在
ScreensFramework
类(
Main
类)中定义的节点
screen

因此,每次单击屏幕(场景)上的
按钮
,都会触发一个
动作事件
然后移到另一个屏幕

myController.setScreen(ScreensFramework.screen2ID);
如果可能的话,我想做的是使用屏幕2上
TextField
中的值 并将其转移到Scene3上的
文本字段
。我发现除非两个FXML 文件已加载。到目前为止,这是不可能的。这是一个桌面应用程序。 那么,如何创建一个全局变量,并在一个类被创建后具有生命 卸载还是卸载了一个FXML文件? 此时,我不希望数据库完成此任务。 我在VisualBasic6中开发了一个全局变量 可以在整个应用程序中使用

定义模型类:

public class Model {

    // Define properties, for example:

    private StringProperty text = new SimpleStringProperty();

    public StringProperty textProperty() {
        return text ;
    }

    public final String getText() {
        return textProperty().get();
    }

    public final void setText(String text) {
        textProperty().set(text);
    }

    // other properties...

}
ScreensController
类中实例化并公开它:

public class ScreensController extends StackPane {

    private final Model model = new Model() ;

    public Model getModel() {
        return model ;
    }

    // other code as before...
}
现在,您可以将东西绑定在一起:

public class ScreenController2 implements ControlledScreen, Initializable {

    private ScreensController myController ;

    @FXML
    private TextField textField ;

    // other code...

    @Override 
    public void setScreenParent(ScreensController parent) {
        this.myController = parent ;

        // Either:
        myController.getModel().setText(textField.getText());
        textField.textProperty().addListener((obs, oldText, newText) -> 
            myController.getModel().setText(newText));

        // or, depending on the exact behavior you want:
        myController.getModel().textProperty()
            .bindBidirectional(textField.textProperty());
    }

    // ...
}


阅读并查看是否有帮助。@James_D谢谢,但本主题的所有链接似乎都是预定义的变量,而不是在运行时输入的。这里有一个链接可以工作,但变量是预定义的。创建一个模型类(只是用来保存数据的东西)。您可以首先定义它并将其传递给您需要的任何控制器。然后只需从一个控制器修改它的状态,其他控制器就可以访问该状态。实际上,您不能将所需的数据放入
ScreensController
类中吗?所有控制器都有一个对该实例的引用,因此您在其中放置的任何数据都将由所有控制器共享。@James\u D我将在此处发布代码,因为此站点甚至不适合发布代码。我的问题是在哪里或如何捕获屏幕4上输入的数据并将其传输到屏幕3我确实需要返回到ScreensController,因此在该类中,我将在何处处理该变量并将其传递给正确的控制器在本例中,屏幕3请注意,这与,但适应了安吉拉·凯塞多的框架。在你的评论中,你说“变量是预定义的”:这没有问题;
模型可以预定义,您只需在需要时更新其状态即可。@Jame\u谢谢您的帮助,我仍在研究它的工作原理,但代码仍在工作。我用一个FXML文件和一个控制器编写了一个应用程序,其中有6个场景,制作了400 x 300的AnchorPane,并将窗格设置为1200 x 900,因此每个视图都是AnchorPane的大小。我需要发表一篇关于如何使用FXML管理FX应用程序中的组合框的新文章,谢谢dwight
public class ScreenController2 implements ControlledScreen, Initializable {

    private ScreensController myController ;

    @FXML
    private TextField textField ;

    // other code...

    @Override 
    public void setScreenParent(ScreensController parent) {
        this.myController = parent ;

        // Either:
        myController.getModel().setText(textField.getText());
        textField.textProperty().addListener((obs, oldText, newText) -> 
            myController.getModel().setText(newText));

        // or, depending on the exact behavior you want:
        myController.getModel().textProperty()
            .bindBidirectional(textField.textProperty());
    }

    // ...
}
public class ScreenController3 implements ControlledScreen, Initializable {

    private ScreensController myController ;

    @FXML
    private TextField textField ;

    // other code ...

    @Override
    public void setScreenParent(ScreensController parent) {
        this.myController = parent ;

        // Again, replace the next two lines with a bidirectional
        // binding if that is the behavior you want
        textField.setText(myController.getModel().getText());
        myController.getModel().textProperty().addListener((obs, oldText, newText) -> 
            textField.setText(newText));
    }

    // ...
}