JavaFX:在多个fxml场景中使用单个变量

时间:2018-05-26 00:03:20

标签: java javafx

好吧,伙计们,我和SWING一直在合作,但最近开始学习一些FX。到目前为止,我已经取得了很好的进展,我已经学到了很多东西。在Swing中,很容易声明一个全局变量,然后在所有框架中使用它而不会出现任何问题或任何问题。但是在JavaFX中它是一个很大的问题。

我到处搜寻这个问题,但我似乎无法找到正确的答案。

所以我有一些正在接收用户输入的文本字段,我想保存输入并将其显示在新文本的新文本字段中。

这是代码

FirstController.java

private void reggy(ActionEvent event) {
      try { 
      String username_text = username.getText().trim();

    String password_text = password.getText().trim();

        Connection conn = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/store","root","password"); 
        Statement st = (Statement) conn.createStatement(); 
        String sql = "select username, password from users where username ='"+username_text+"' and password ='"+password_text+"'";
        ResultSet rs;
        rs = st.executeQuery(sql);




int count = 0;
   while(rs.next()) {
       count = count +1;
   }
   if(count == 1){
       AnchorPane pane = FXMLLoader.load(getClass().getResource("second.fxml"));
       rootpane.getChildren().setAll(pane);
       System.out.println("User Found, Logged in");

   }

现在主要问题是如何获取变量" String username_text"准备在不同的FXML文档中使用(second.fxml)

提前多多感谢。真的很感激帮助。一个初学者在这里尝试通过FX工作。

2 个答案:

答案 0 :(得分:0)

< p>这与FXML没有任何关系,但通常与Java有关。< / p> < p>在我的应用程序中,当出现需要时,我使用< code> Singleton< / code>用于保存全局变量的类:< / p> < p为H. Global.java:其中/ p为H. < pre>< code> public final class Global {     private static String usernameText;     private Global(){} //用于防止实例化的私有构造函数     public static String getUsernameText(){         return usernameText;     }     public static void setUsernameText(String usernameText){         Global.usernameText = usernameText;     } } < /代码>< /预> < p>从那时起,您可以在应用程序的任何位置设置/获取值:< / p> <预><代码> Global.setUsernameText( “my_username”); String username = Global.getUsernameText(); < /代码>< /预> < p>这显然是一个非常简单的例子。查看< a href =“http://www.javacoffeebreak.com/articles/designpatterns/index.html”rel =“nofollow noreferrer”>本文< / a>了解更多关于单身人士和一些需要注意的缺点。< / p>

答案 1 :(得分:0)

更新1

如果你的代码是

,你应该替换这部分
if(count == 1){
    AnchorPane pane = FXMLLoader.load(getClass().getResource("second.fxml"));
    rootpane.getChildren().setAll(pane);
    System.out.println("User Found, Logged in");
}

用这个:

if(count == 1){
    FXMLLoader loader = new FXMLLoader(getClass().getResource("second.fxml"));
    AnchorPane pane = loader.load();
    SecondController controller = (SecondController) loader.getController();
    controller.updateUsernameText(username_text);
    rootpane.getChildren().setAll(pane);
    System.out.println("User Found, Logged in");
}

(如果需要,将SecondController替换为第二个控制器的类名)

然后剩下要做的就是在第二个控制器类中创建这个方法:

void updateUsernameText(String username_text) {
    // your code here
}

另外,我建议你使用java命名约定,在google上搜索:)

简而言之,变量名称不应包含下划线,每个单词的首字母大写(第一个单词除外),如下所示:usernameText。方法也是如此,除了它们应该以动词开头。课程也应该首字母大写(你已经完成了我认为,对第二个控制器不确定)。

旧帖子

一种不同的方法(比全局类IMO更好,因为它允许多个实例并且无法从外部访问)是简单地使用方法将文本从一个类传递到另一个类。

首先,在第二个控制器中添加一个方法以允许传递文本:

void setText(String text) {
    textField.setText(text);
}

然后在第一个(主)控制器中添加它:

FXMLLoader loader = new FXMLLoader(...);
Scene scene = new Scene(loader.load());
SecondController second = (SecondController) loader.getController();
second.setText(someText);