代码之家  ›  专栏  ›  技术社区  ›  Zarkonnen

非阻塞模式Swing进度对话框

  •  16
  • Zarkonnen  · 技术社区  · 15 年前

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

    如果我在EDT上执行这个过程,这显然会阻止最终用户在过程进行时执行任何操作。但是由于EDT正忙于处理,所以它从来都不会渲染对话框的内容,所以我只得到对话框的轮廓。

    但是,如果我在工作线程中执行该过程,最终用户可以单击按钮并使EDT操作该工作线程同时也在操作的状态,使用 坏东西 因此。如果我将对话框设置为模态,则不会发生这种情况,但是 情态动词 摇摆也意味着 舞台调度 ,所以我一打电话 setVisible(true) ,线程永远阻塞。

    因此,我当前的“解决方案”是使用一个工作线程,然后派生出一个单独的线程,其唯一目的是吸收 setVisible . 一定有更好的解决办法!

    那么,我如何获得一个对话框,防止用户与系统的其他部分交互(模态),但不阻塞导致其可见的线程?

    2 回复  |  直到 15 年前
        1
  •  15
  •   AppleGrew    15 年前

    您应该使用GlassPane来阻止用户进行交互。好的是这是用户的模式,而不是你的程序,这样你的线程就不会被阻塞。

    好消息是,您还可以使用它来实现很酷的GUI效果,例如使GUI部分变暗,而用户无法与之交互。您还可以在玻璃窗格中显示忙碌的gif图像。

    链接:-

    1. Official tutorial on GlassPane
    2. Some helpful tutorials
    3. Another tut
    4. Oreilly's Swing Hacks 很好。
        2
  •  0
  •   Andrew Thompson    15 年前

    你一定是做错了什么。尝试教程 How to Use Progress Bars . 如果您能够理解代码的工作原理,那么它应该为您提供实现所需功能的方向。

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

    推荐文章