[英]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.