我需要一种方法来从数据库中获取一些数据,并防止用户修改现有的数据在那一刻。
我创建了一个的SwingWorker使数据库更新和模态的JDialog显示用户正在发生的事情(用的JProgressBar)。 模态对话框有defaultCloseOperation设置为DO_NOTHING,所以只能用一个适当的呼叫关闭-我用setVisible(false)
。
MySwingWorkerTask myTask = new MySwingWorkerTask();
myTask.execute();
myModalDialog.setVisible(true);
该SwingWorker的做一些事情中doInBackground(),最后调用:
myModalDialog.setVisible(false);
我只关注我的问题:是否有可能是SwingWorker的执行setVisible(false)
之前,它是setVisible(true)
在工人产卵后的行?
如果是这样的setVisible(true)
可以永远阻止(用户不能关闭模态窗口)。
我一定要实现的东西如下:
while (!myModalDialog.isVisible()) {
Thread.sleep(150);
}
myModalDialog.setVisible(false);
以确保它真正能拿到关闭?
一般情况下,是的。
我会做的是在你的doInBackground
方法是使用SwingUtilities.invokeLater
显示对话框,并在您done
方法隐藏对话框。
这应该意味着,即使对话没有使它的屏幕上,你获得对流量多一点控制...
次要问题是你现在将不得不对话框传递给员工,因此可以对其进行控制...
public class TestSwingWorkerDialog {
public static void main(String[] args) {
new TestSwingWorkerDialog();
}
private JDialog dialog;
public TestSwingWorkerDialog() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
MyWorker worker = new MyWorker();
worker.execute();
}
});
}
public class MyWorker extends SwingWorker<Object, Object> {
@Override
protected Object doInBackground() throws Exception {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
getDialog().setVisible(true);
}
});
Thread.sleep(2000);
return null;
}
@Override
protected void done() {
System.out.println("now in done...");
JDialog dialog = getDialog();
// Don't care, dismiss the dialog
dialog.setVisible(false);
}
}
protected JDialog getDialog() {
if (dialog == null) {
dialog = new JDialog();
dialog.setModal(true);
dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
dialog.setLayout(new BorderLayout());
dialog.add(new JLabel("Please wait..."));
dialog.setSize(200, 200);
dialog.setLocationRelativeTo(null);
}
return dialog;
}
}