Java 将Swing JDialog设置为非模态
我在将JDialog设置为非模态时遇到问题。 我需要在不阻塞应用程序其余部分的情况下显示一个弹出窗口。我尝试使用SwingUtilities.invokeLater(),但顾名思义,它是在主线程完成工作之后调用的。 为简化起见,以下是我的代码:Java 将Swing JDialog设置为非模态,java,swing,Java,Swing,我在将JDialog设置为非模态时遇到问题。 我需要在不阻塞应用程序其余部分的情况下显示一个弹出窗口。我尝试使用SwingUtilities.invokeLater(),但顾名思义,它是在主线程完成工作之后调用的。 为简化起见,以下是我的代码: BufferedReader reader = new BufferedReader(new FileReader(log)); JLabel validator = new JLabel("Validating - please wa
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“我是一个完全摇摆不定的人。基本上,我的意思是在验证阶段显示一个对话框,一旦结束,我就需要关闭它(没有用户干预)。在显示对话框之前,您需要启动应用程序的代码才能继续,然后再显示对话框。完美。这正是我想要的。经过一些更改后,我成功地获得了所需的结果。谢谢!!