【问题标题】:Swing application problem摇摆应用问题
【发布时间】:2009-06-25 12:40:25
【问题描述】:

我正在开发 Swing 应用程序,通常一切正常。但我有一个 GUI 问题。

当我运行应用程序时,例如最小化其他窗口,我的应用程序仍在工作,但JFrame 的中心部分不可见或隐藏。在完成程序逻辑的某些部分后,GUI 重新绘制并再次可见。这将一直持续到程序完成运行。

是否有任何 API 可以防止这种行为,或者某些类用于强制 GUI 可见,或者可能添加一些进度条?

如果有人需要此信息,我将在 Windows Vista 上使用 java 1.6 进行测试。

【问题讨论】:

    标签: java swing swingworker


    【解决方案1】:

    在我看来,您正在执行某种缓慢的 IO 或计算,导致您的 GUI 变得无响应。

    您需要做的是在另一个线程中执行长时间运行的进程。

    执行此操作的标准方法是使用 SwingWorker 类。

    Java tutorials 有一些关于如何正确使用SwingWorker 的优秀资源和教程。

    Herehere 是指向另一个我认为可能类似的问题的链接。

    您看到的这种行为是您长时间运行的进程阻塞了 GUI 用来重绘自身的线程的结果。因此,当您执行任务时,GUI 无法重新绘制您的 JFrame,并且它变得无响应。

    【讨论】:

    • 在某些情况下,当窗口区域在 Windows 下变脏时,Swing 会忘记重新绘制自己。每隔几秒运行一个 Swing Timer 并向窗口发出 repaint()。
    • 当一个窗口被重新激活(重新获得焦点)时,它会默认重新绘制自己。
    • 添加计时器可能会有所帮助,但如果线程被阻塞,GUI 将无法重新绘制自身。
    • 我的案例不涉及任何EDT阻塞操作。我猜这与底层 d3d 管道的一些“属性”有关。
    【解决方案2】:

    正如 jinguy 所说,您很可能正在执行一项需要很长时间才能完成并且需要放入后台线程的任务。查看 Java Sun Concurrency in Swing 教程,了解有关如何正确执行此操作的更多信息。

    【讨论】:

      【解决方案3】:

      您似乎需要在单独的线程中执行您长期运行的业务操作。我建议你使用SwingWorker

      检查这个简单的example

      【讨论】:

        猜你喜欢
        • 2013-01-29
        • 1970-01-01
        • 2012-11-20
        • 1970-01-01
        • 2012-04-20
        • 1970-01-01
        • 2012-10-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多