Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GUI-在不同窗口(JFrame、JDialog、JOptionPane)之间传输数据_Java_Swing_Jframe_Joptionpane_Jdialog - Fatal编程技术网

Java GUI-在不同窗口(JFrame、JDialog、JOptionPane)之间传输数据

Java GUI-在不同窗口(JFrame、JDialog、JOptionPane)之间传输数据,java,swing,jframe,joptionpane,jdialog,Java,Swing,Jframe,Joptionpane,Jdialog,我一直在使用bash脚本以及一些java(控制台)和python来满足我的编程需求。我想是时候把我的工作整理到图形化的环境中去了,我偶然发现了一个基本的任务,这个任务让我绞死了好几个小时 main函数在启动主应用程序窗口之前调用登录JDialog。JDialog实例运行一个基本的身份验证检查(简单的if语句),并相应地将登录对话框中的类字段设置为true/false。我希望在调用类中检索此检查的结果和文本框中键入的用户名。似乎几乎不可能 那么,创建窗口的新实例(更合适的框架、对话框……)并能够检

我一直在使用bash脚本以及一些java(控制台)和python来满足我的编程需求。我想是时候把我的工作整理到图形化的环境中去了,我偶然发现了一个基本的任务,这个任务让我绞死了好几个小时

main函数在启动主应用程序窗口之前调用登录JDialog。JDialog实例运行一个基本的身份验证检查(简单的if语句),并相应地将登录对话框中的类字段设置为true/false。我希望在调用类中检索此检查的结果和文本框中键入的用户名。似乎几乎不可能

那么,创建窗口的新实例(更合适的框架、对话框……)并能够检索一些类字段的最佳方法是什么?我心目中的表格比是/否的答案要复杂一点。我应该能够打开一个登录窗口,一个设置窗口,或者一个带有报表参数的表单

编辑: 一些代码用于对问题进行示例

public class Main extends JFrame {

private JPanel contentPane;

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Login login = new Login();
                login.showLogin();
                System.out.println(login.getTheText());

                Main frame = new Main();
                frame.setVisible(false);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

public Main() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    setContentPane(contentPane);
}
}

}


我在创建时将文本字段txtTest设置为“test”。无论我在框中键入什么,我都会继续在Main中接收原始的“test”值。

确保JDialog设置为模态JDialog,这可以通过使用适当的JDialog构造函数或setter方法来完成。这样做意味着,当您将其设置为可见时,调用代码将停止并不会继续,直到对话框不再可见。一旦发生这种情况,调用代码在停止后立即重新启动。然后可以查询对话框对象的字段所包含的值

关于一个具体的例子,请看我对一个类似问题的回答


在JDialog返回后,您不会查询它。i、 e

   System.out.println(login.getTheText());
   String text = login.getTheText();
   Main frame = new Main(text);  // and pass it into the other class.
这已经在我的链接中进行了解释和演示。请读一下。此外:

  • 您需要通过创建构造函数或使用setter方法将信息传递到main中
  • 由于未知原因,您正在主GUI JFrame上调用
    setVisible(false)
  • 不要设置边界或使用空布局。使用布局管理器并打包GUI

您可以对任何GUI元素执行相同的操作:将任何必需的对象引用传递到GUI元素中(通过构造函数或其上的setXXX())

两种常见的做法是通过使用(标记事件发生的时间)或在执行任务时通过队列

没有更多的信息,这就是我所能提供的


不过,我要补充的是,在进行GUI工作时,要非常清楚您执行的线程上下文。无论何时修改GUI对象或其底层模型,都必须处于Swing事件调度线程中。任何长时间运行的任务必须在单独的工作线程中执行。我看到很多很多问题,人们无法理解这一点。有关详细信息,请参阅。

有关创建模式对话框的信息,请参阅。由于某种原因,您忽略了我的建议,因为您没有使用模式对话框--为什么?如果你有充分的理由这样做,请告诉我们原因,但请不要忽略REC。另外,请看我一个多小时前的答案中的链接;对话框关闭后,文本进入控制台,因此我假设模态语句是正确的。将尝试使用构造函数。对不起,你是对的。当对话框返回或将JFrame设置为可见时,您不会查询该对话框。请参见编辑以回答问题。
   System.out.println(login.getTheText());
   String text = login.getTheText();
   Main frame = new Main(text);  // and pass it into the other class.