Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.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 将Swing JDialog设置为非模态_Java_Swing - Fatal编程技术网

Java 将Swing JDialog设置为非模态

Java 将Swing JDialog设置为非模态,java,swing,Java,Swing,我在将JDialog设置为非模态时遇到问题。 我需要在不阻塞应用程序其余部分的情况下显示一个弹出窗口。我尝试使用SwingUtilities.invokeLater(),但顾名思义,它是在主线程完成工作之后调用的。 为简化起见,以下是我的代码: BufferedReader reader = new BufferedReader(new FileReader(log)); JLabel validator = new JLabel("Validating - please wa

我在将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,但由于无法从主线程调用它,我不得不创建一个新线程,因此结果几乎相同


您有什么建议吗?

您需要在显示模式
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);
BufferedReader reader=newbufferedreader(newfilereader(log));
JLabel validator=新的JLabel(“正在验证-请稍候”);
JOptionPane=new JOptionPane(验证器,JOptionPane.INFORMATION_消息,JOptionPane.NO_选项,null,新字符串[]{“Close”});
final JDialog dialog=pane.createDialog(null,“title”);
dialog.setModal(true);
SwingWorker myWorker=新SwingWorker(){
公共无效doInBackground(){
//做长时间运行的过程
//也许包括
编写器=验证(读卡器);
// ....
返回字符串;
}
public void done(){
更新JLabel
在这里处理对话框!
}
};
myWorker.execute();
对话框.setVisible(true);

为什么不创建您自己的对话框并向其中添加
JOptionPane
…我尝试了,但仍然得到了相同的结果。如果我将其设置为模式,我会得到完美的结果,但我的应用程序在没有用户输入的情况下无法继续。如果我将其设置为非模式,GUI将无法正常显示,但其余代码将正常工作。我应该从以下内容开始:I“我是一个完全摇摆不定的人。基本上,我的意思是在验证阶段显示一个对话框,一旦结束,我就需要关闭它(没有用户干预)。在显示对话框之前,您需要启动应用程序的代码才能继续,然后再显示对话框。完美。这正是我想要的。经过一些更改后,我成功地获得了所需的结果。谢谢!!