基于 Swing 的加载框架挂在 DB 查询上

Posted

技术标签:

【中文标题】基于 Swing 的加载框架挂在 DB 查询上【英文标题】:Swing based loading frame hangs on DB query 【发布时间】:2014-01-14 12:38:37 【问题描述】:

我知道有很多类似的主题,但我无法将这些解决方案应用于我的项目。

我有一个巨大的 Java 应用程序,其中有许多耗时的数据库操作。一切都在一个线程中实现,因此当程序查询数据库时,UI 会挂起。我的任务是在所描述的情况下制作加载窗口。我试过JWindow 对象,JFrame 总是在顶部,模态对话框,但它们都没有工作。

事情是这样的: 我有JDialog,其中包含JPanel。该面板由 2 个输入字段(loginpassword)和登录按钮组成。当用户按下登录时,(在顶部)应该出现"Loading..." 窗口。对话框是模态的,是alwaysOnTop

我应该怎么做?

我得到的最接近的解决方案是:

JDialog modalDialog = new JDialog(dialog, "Busy", ModalityType.MODELESS);
modalDialog.add(new JLabel("Loading..."));
modalDialog.setSize(200, 150);
modalDialog.setLocationRelativeTo(dialog);
modalDialog.setVisible(true);

但是对话框自己画得不好:

它包含来自背景而不是Loading text...的元素

加载完成后,它会根据需要显示Loading... text

当我添加时

      modalDialog.setUndecorated(true);

它不会在第一个平面上绘制...而且我不想要带有 [X] 的条形

【问题讨论】:

尝试 UpdateUI 并重新绘制。 不要阻塞 EDT(事件调度线程)——当这种情况发生时,GUI 将“冻结”。而不是调用Thread.sleep(n) 实现一个Swing Timer 用于重复任务或一个SwingWorker 用于长时间运行的任务。有关详细信息,请参阅Concurrency in Swing。 “我知道有很多类似的主题,但我无法将这些解决方案应用到我的项目中。” 为什么不呢?链接到前 5 名。 ***.com/questions/4870273/…***.com/questions/21113768/…***.com/questions/12937759/… 我已经尝试过了,但事实证明这里的问题是我不能有两个带有 setAlwaysOnTop(true) 的帧 - 我花了将近 3 天的时间来弄清楚:) 我仍然没有知道为什么我粘贴的代码不起作用。 【参考方案1】:

不要将耗时的操作与 Swing UI 操作放在同一个线程上。所有 Swing UI 操作都发生在“事件调度线程”上,您可以自行决定避免耗时的操作。

查看 javax.swing.SwingWorker 中的一个类,它可以轻松地将耗时的操作放在不同的线程上。

查看一个 javax.swing.JProgressBar,它允许您在耗时的操作正在进行时显示进度条。

【讨论】:

是的,我知道,但就像我说这不是我的应用程序 :) 实际上,您说“我有一个应用程序......”并没有说它不是“你的”。这仍然是解决问题的方法。 ok.. 我发现当有两个帧调用了 setAlwaysOnTop(true) 时,就会出现所描述的问题。因此,删除此方法的一次调用为我解决了这个问题。我想知道我是因为英语不好还是因为一个愚蠢的问题而得了-2分:) 我希望这两者都不是,而是问题的模糊性。我们这里试图帮助你的人并没有足够的信息,而我对问题的猜测并不是真正的问题这一事实证实了这一点。过了一段时间,我们就完全停止回答这些问题了,因为这往往是在浪费时间。 好的,我保证以后会更准确。谢谢

以上是关于基于 Swing 的加载框架挂在 DB 查询上的主要内容,如果未能解决你的问题,请参考以下文章

Java Swing 保存和加载工作区/设置

基于SSM框架开发设计java游戏制作源码仿pk基于c/s开发角色扮演swing,有血量装备攻击怪物等(源码+数据库文件)

实体框架查询——加载数据优化

在 Swing 中实现后退按钮功能 [重复]

Cognos 11.1.7 框架管理器更改查询主题的表,键入数据

播放框架在启动时挂起:“正在加载项目定义”