16

一个愚蠢的问题,但我真的无法让它工作:我在 Swing 应用程序中有一些长时间运行的进程,可能需要几分钟。我想在此过程进行时向用户显示进度对话框。我还想阻止用户执行进一步的操作,例如在进程进行时按下按钮。

如果我在 EDT 上执行该过程,这显然会阻止最终用户在该过程进行时做任何事情。但是因为 EDT 正忙于处理,它永远不会渲染对话框的内容,所以我只得到对话框的轮廓。

但是,如果我在工作线程中执行该过程,最终用户可以单击按钮并导致 EDT 操纵工作人员同时也在操纵的状态,结果是坏东西。如果我将对话框设为模态,那不会发生,但Swing 中的模态也意味着阻塞,所以在我调用的那一刻setVisible(true),线程永远阻塞。

所以我目前的“解决方案”是使用一个工作线程,然后产生一个单独的线程,其唯一目的是吸收setVisible. 当然必须有更好的解决方案!

那么如何获得一个对话框来阻止用户与系统的其余部分(模式)交互但不阻止导致它可见的线程?

4

2 回答 2

15

您应该使用 GlassPane 来阻止用户进行交互。好消息是这对用户来说是模态的,而不是你的程序,所以你的线程不会被阻塞。

好消息是,您还可以将它用于很酷的 GUI 效果,例如遮蔽 GUI 部分繁忙且用户无法与之交互。您还可以在 GlassPane 中显示忙碌的 gif 图像。

链接:-

  1. GlassPane 官方教程
  2. 一些有用的教程
  3. 另一个啧啧
  4. Oreilly 的 Swing Hacks非常棒。
于 2010-10-11T06:59:25.107 回答
0

你一定做错了什么。尝试有关如何使用进度条的教程。如果您能够理解该代码的工作原理,它应该为您提供实现所需功能的方向。

请注意,进度条通常是模态的。

于 2010-10-08T08:35:14.877 回答