【问题标题】:setting Swing JDialog to non modal将 Swing JDialog 设置为非模态
【发布时间】:2014-04-23 10:57:22
【问题描述】:

我在将 JDialog 设置为非模态时遇到问题。 我需要在不阻止应用程序的其余部分的情况下显示一个弹出窗口。我尝试使用 SwingUtilities.invokeLater() 但顾名思义,它是在主线程的工作完成后才调用的。 为简化起见,这是我的代码:

BufferedReader reader = new BufferedReader(new FileReader(log));
        JLabel validator = new JLabel("Validating  - please wait");
        JOptionPane pane = new JOptionPane(validator, JOptionPane.INFORMATION_MESSAGE,JOptionPane.NO_OPTION,null, new String[]{"Close"});
        final JDialog dialog = pane.createDialog(null, "title");
        dialog.setModal(false);
        dialog.setVisible(true);
        dialog.setVisible(true);
        writer = validate(reader);
        dialog.dispose();

对话框显示,但它是空的。如果我将它用作模态,它会显示得很好。我尝试将它与某些变体一起使用,例如:

JLabel validator = new JLabel("Validating - please wait");
            JOptionPane pane = new JOptionPane(validator, JOptionPane.INFORMATION_MESSAGE,JOptionPane.NO_OPTION,null, new String[]{"Close"});
            final JDialog dialog = pane.createDialog(null, "Validation in progress");
            Runnable run = new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    dialog.setModal(false);
                    dialog.setVisible(true);
                }

            };
            SwingUtilities.invokeLater(run);
            writer = validate(reader);

但正如我所说,对话框调用对我来说太晚了。 (我也试过invokeAndWait,但是因为我不能从主线程调用它,所以我必须创建一个新线程,所以结果几乎是一样的。

你有什么建议吗?

【问题讨论】:

  • 为什么不直接创建自己的对话框并添加JOptionPane...
  • 我试过但仍然得到相同的结果。如果我将其设置为 Modal,我会得到完美的结果,但如果没有用户输入,我的应用程序将无法继续。如果我将其设置为非模态,则 GUI 将无法正确显示,但其余代码将工作文件。我应该从这个开始:我是一个彻头彻尾的 Swing 菜鸟。基本上我的意思是在验证阶段显示一个对话框,一旦它结束我需要关闭它(没有用户干预)。
  • 您需要为应用程序启动代码以继续显示对话框,然后显示对话框。

标签: java swing


【解决方案1】:

你需要在显示模态JDialog之前启动你的代码进程,然后显示对话框。如果验证方法需要很长时间,您也许可以使用后台线程。像这样的:

BufferedReader reader = new BufferedReader(new FileReader(log));
JLabel validator = new JLabel("Validating  - please wait");
JOptionPane pane = new JOptionPane(validator, JOptionPane.INFORMATION_MESSAGE,JOptionPane.NO_OPTION,null, new String[]{"Close"});
final JDialog dialog = pane.createDialog(null, "title");
dialog.setModal(true);

SwingWorker myWorker = new SwingWorker<String, Void>() {
  public void doInBackground() {
     // do long running process
     // perhaps including
     writer = validate(reader);

     // ....

     return yourString;
  }

  public void done() {  
    update JLabel
    dispose of dialog here!
  }
};
myWorker.execute();
dialog.setVisible(true);

【讨论】:

  • 完美。正是我想要的。经过一些更改,我设法获得了预期的结果。谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多