当前位置: 首页 > 面试题库 >

安全地打开和关闭模式JDialog(使用SwingWorker)

濮阳赞
2023-03-14
问题内容

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

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

}


 类似资料:
  • 问题内容: 我目前正在编写一个小脚本,供在使用Python的一台服务器上使用。该服务器仅安装了Python 2.4.4。 直到2.5版本问世,我才开始使用Python,所以我习惯了这种形式: 但是,在2.5之前没有声明,而且我很难找到有关手动清理文件对象的正确方法的示例。 使用旧版本的python时安全处置文件对象的最佳实践是什么? 问题答案: 参见docs.python.org: 处理完文件后,

  • 问题内容: 我有一个使用JPA的项目J2SE。在某些JDialogs中,我确实返回并在类的构造函数中填充JTable,JComboBox,JList等。 因此,当我为这些对话框创建任何实例时,有时会很慢。 我认为使用SwingWorker和JProgressbar并创建一个(加载)来打开JDialogs是一个很好的解决方案,但是我不知道该怎么做。 我正在尝试这个。 如何打开JDialog并创建要使

  • 问题内容: 从使用ReactJS的prop验证功能开始,正如文档所说,出于性能原因,该功能仅在“开发模式”下有效。 React似乎正在验证我注释的特定组件的属性,但我不记得显式打开“开发模式”。 我尝试搜索如何触发/切换开发模式,但是没有任何运气。 问题答案: 对方的回答假设您使用外部预建的文件从反应,而正确的,是大多数人不会如何去或 应该 消耗作出反应,一个包。而且,在这一点上,大多数每个Rea

  • 本章讨论的是如何进入和退出CGDB。有如下几种方法: 在命令行下输入 'cgdb' 运行CGDB 在GDB窗口输入 'quit' 或者按下 'Ctrl+D' 退出CGDB 在源代码窗口输入 ':quit' 也可以退出CGDB。这在GDB挂起或者运行一条耗时很长的指令时也同样起作用

  • 使用葫芦机器人打开和关闭飞行模式的最佳方法是什么? 我可以使用?? 上面set_preferences做什么?我想在应用程序测试期间设置android设置。 谢谢

  • 我不想使用angular2-bootstrap或ng2-bs3-modal,如问题/答案Angular 2 Bootstrap Modal和Angular 2.0和Modal对话框中所建议的 现在。我知道什么打开和关闭引导模式。 显示在和之间切换 属性在上在和之间切换 因此,我很自然地认为,如果我绑定到属性,就像So,那么我就可以操纵它。遗憾的是,我无法绑定到,因为它不是的已知属性。(注意,不存在