2015-03-31 28 views
0

我有一个多场景基于安吉拉凯塞多码的JavaFX FXML应用 https://blogs.oracle.com/acaicedo/entry/managing_multiple_screens_in_javafx1变量有多个FXML文件

我添加了一个TextFieldScene2.fxmlScene3.fxml文件中的每个场景都有 自己的Controller一类具有ScreensController类加载一个HashMap与 标识name,节点screen,其在ScreensFramework类(Main类)中所定义

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

所以,每次点击屏幕(场景)上Button你火了ActionEvent 并移动到另一个屏幕

myController.setScreen(ScreensFramework.screen2ID); 

我想做些什么,如果有可能的是使用的值TextField Screen2 并将其传送到场​​景3上的TextField。我发现,除非FXML 文件被加载,否则这是迄今为止不可能的。这是一个桌面应用程序。 那么如何创建一个GLOBAL变量,并且在一个班级卸载后或者卸载了一个FXML文件后,该变量是 ? 在这一点上,我不希望数据库来完成这项任务。 我已经开发了Visual Basic 6,我只是声明一个全局变量, 可以在整个应用程序中使用。

+0

阅读http://stackoverflow.com/questions/14187963/passing-parameters-javafx-fxml/14190310#14190310,看看是否有帮助。 – 2015-03-31 22:27:26

+0

@James_D谢谢,但这个话题的所有链接似乎行事,如果变量是预定义的,并没有在运行时输入这里是一个链接工程http://stackoverflow.com/questions/12166786/multiple-fxml-with- controllers-share-object /但该变量已预先定义 – Grendel 2015-04-01 00:28:32

+0

创建一个模型类(仅用于保存数据)。您可以先将其定义并将其传递给您需要的任何控制器。然后只需从一个控制器修改它的状态,其他控制器就可以访问状态。 – 2015-04-01 00:31:37

回答

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

    // ... 
} 
+0

请注意,这与http:// stackoverflow完全相同。com/questions/14187963/passing-parameters-javafx-fxml/14190310#14190310,但改编为Angela Caicedo的框架。在你的评论中你说过“变量是预定义的”:这没问题; 'model'可以被预定义,你只需要在需要时更新它的状态。 – 2015-04-02 16:19:59

+0

@Jame_D谢谢你非常有帮助我仍在研究它是如何工作的,但代码工作正常。我已经用一个FXML文件和一个带有6个场景的控制器编写了应用程序,将AnchorPane 400设置为300,并将窗格设置为1200,这样每个视图就是AnchorPane的大小,我需要就如何管理FXML的FX应用程序中的ComboBox谢谢德怀特 – Grendel 2015-04-08 20:47:27