具有多个FXML文件的变量

时间:2015-03-31 21:29:10

标签: variables javafx fxml

我有一个多场景JavaFX FXML应用程序 基于Angela Caicedo代码 https://blogs.oracle.com/acaicedo/entry/managing_multiple_screens_in_javafx1

我在每个场景中添加了TextFieldScene2.fxmlScene3.fxml个文件 它自己的Controller类,其ScreensController类加载HashMap 标识namescreen类(ScreensFramework类)中定义的节点Main

public void addScreen(String name, Node screen) {
    screens.put(name, screen);
}

因此,每当您点击屏幕(场景)上的Button时,您都会点击ActionEvent 并转到另一个屏幕

myController.setScreen(ScreensFramework.screen2ID);

如果可能,我想做的是使用Screen2上TextField中的值 并将其传递给Scene3上的TextField。我发现除非两个FXML 加载文件到目前为止这是不可能的。这是一个桌面应用程序。 那么如何创建一个GLOBAL变量并且在一个类之后具有生命的变量 卸载或卸载一个FXML文件? 此时我不希望数据库完成此任务。 我已经在Visual Basic 6中开发了我将声明一个全局变量 可以在整个申请中使用。

1 个答案:

答案 0 :(得分:0)

定义模型类:

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

    // ...
}

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

    // ...
}