【问题标题】:GUI - Transfer data between different windows (JFrame, JDialog, JOptionPane)GUI - 在不同窗口之间传输数据(JFrame、JDialog、JOptionPane)
【发布时间】:2014-01-10 16:24:37
【问题描述】:

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

主函数在启动主应用程序窗口之前调用登录 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);
}

}

public class Login extends JDialog {

private JTextField txtTest;
public void showLogin() {
    try {
        Login dialog = new Login();
        dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dialog.setVisible(true);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public String getTheText() {
    return txtTest.getText();
}
public Login() {
    setModal(true);
    setBounds(100, 100, 450, 300);
    getContentPane().setLayout(null);

    txtTest = new JTextField();
    txtTest.setText("test");
    txtTest.setBounds(112, 141, 86, 20);
    getContentPane().add(txtTest);
    txtTest.setColumns(10);

}

}

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

【问题讨论】:

  • 查看this answer 创建模态JDialog 登录
  • 由于您没有使用模态对话框,因此您出于某种原因忽略了我的建议——为什么?如果您有充分的理由这样做,请告诉我们原因,但请不要忽略记录。另请查看一个多小时前我的回答中的链接。
  • 我正在使用模态(我认为)和语句 setModal(true);对话框关闭后文本会出现在控制台中,所以我认为模态语句是可以的。将尝试使用构造函数。
  • 对不起,你是对的。当对话框返回或设置 JFrame 可见时,您不会查询对话框。请参阅编辑以回答。

标签: java swing jframe joptionpane jdialog


【解决方案1】:

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

具体例子请看我对类似问题here的回答。


您不会在 JDialog 返回后查询它。即,

   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。

【讨论】:

    【解决方案2】:

    您对任何Java POJOs 执行相同的操作:将任何所需的对象引用传递到 GUI 元素(通过构造函数或它们上的 setXXX())。

    两种常见做法是通过使用listeners(标记事件何时发生)或在执行producer/consumer pattern 时通过队列。

    没有更多信息,我只能提供。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      相关资源
      最近更新 更多