安全开启和关闭模式的JDialog(使用的SwingWorker)(Safely open and

2019-07-03 10:48发布

我需要一种方法来从数据库中获取一些数据,并防止用户修改现有的数据在那一刻。

我创建了一个的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);

以确保它真正能拿到关闭?

Answer 1:

一般情况下,是的。

我会做的是在你的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;
    }

}


文章来源: Safely open and close modal JDialog (using SwingWorker)