[英]setting Swing JDialog to non modal
我在将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
之前,需要启动代码过程,然后显示对话框。 如果validate方法需要很长时间,则可以使用后台线程。 像这样:
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.