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

JavaFX:在多个fxml场景中使用单个变量,java,javafx,Java,Javafx,好了,伙计们,我一直在和SWING一起工作,但最近开始学习一些FX。到目前为止,我在这方面取得了很大的进步,我学到了很多。在Swing中,很容易声明一个全局变量,然后在所有框架中使用它,而不会出现任何问题。然而,在JavaFX中,这是一个相当大的问题 我到处寻找这个问题,但似乎找不到正确的答案 因此,我得到了一些从用户那里获取输入的文本字段,我想保存输入并在新场景中的新文本字段中显示它 这是密码 FirstController.java private void reggy(ActionEven

好了,伙计们,我一直在和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\u text”在不同的FXML文档(second.FXML)中使用。


先谢谢你。非常感谢你的帮助。一个初学者在这里试图通过外汇工作的方式

这实际上与FXML没有任何关系,但与Java一般无关

在我的应用程序中,当需要这样做时,我使用
单例
类来保存全局变量:

Global.java:

public final class Global {

    private static String usernameText;

    private Global(){}  // Private constructor to prevent instantiation

    public static String getUsernameText() {
        return usernameText;
    }

    public static void setUsernameText(String usernameText) {
        Global.usernameText = usernameText;
    }
}
从那时起,您可以在应用程序中的任何位置设置/获取值:

Global.setUsernameText("my_username");
String username = Global.getUsernameText();

显然,这是一个非常简单的例子。查看了解更多关于单身人士的信息以及需要注意的一些缺点。

更新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);

这并不能解决我的问题,至少我不这么认为。如果您阅读我的代码,您可以看到变量username\u文本。我希望它是一个全局变量。我该怎么做?这正是一个“全局变量”。在第一个控制器中,只需在第一个控制器中调用
global.setUsernameText(username\u text)
。这并不是JavaFX特有的,因为实现在另一个类中使用该值的目标是一种常见的做法。尽管如此,赵先生下面的回答也是一个可行的解决方案。这一切都取决于你的需要。我在我的第一个FXML文件中有一个文本字段,它接受用户的输入,我只想将存储的“输入”带到新的场景中。我看不出您提供的代码对此有什么帮助。如果我错了,很抱歉,我对FX>@Freakz0r真的很陌生。请检查我的更新答案。我尝试了你的新更新代码,但是它发出了一个错误加载程序。updateUsernameText(username_text);,你能解释一下这句话吗。。这条线发出了一个错误(找不到符号)@Freak0rz是的,很抱歉,在电话里写道。更新它,再试一次,它应该会工作。哦,上帝。谢谢你,朋友。非常感谢。它就像一个符咒。再次感谢你帮助我,能有这样一个有经验的社区是一件幸事。