簡體   English   中英

具有多個FXML文件的變量

[英]Variables with multiple FXML files

我有一個基於Angela Caicedo代碼https://blogs.oracle.com/acaicedo/entry/managing_multiple_screens_in_javafx1的多場景JavaFX FXML應用程序

我已經在Scene2.fxmlScene3.fxml文件中添加了一個TextField ,每個場景都有其自己的Controller類和一個ScreensController類,該類加載了ID nameHashMap ,在ScreensFramework類( Main類)中定義了Node screen

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中進行了開發,我將在其中聲明一個可以在整個應用程序中使用的全局變量。

定義一個模型類:

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

    // ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM