[英]Variables with multiple FXML files
我有一個基於Angela Caicedo代碼https://blogs.oracle.com/acaicedo/entry/managing_multiple_screens_in_javafx1的多場景JavaFX FXML應用程序
我已經在Scene2.fxml
和Scene3.fxml
文件中添加了一個TextField
,每個場景都有其自己的Controller
類和一個ScreensController
類,該類加載了ID name
為HashMap
,在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.