【问题标题】:Java GUI JProgressBar not paintingJava GUI JProgressBar 不绘画
【发布时间】:2010-07-01 03:08:13
【问题描述】:

我有一个 GUI 问题想要解决,但我对正在发生的事情感到困惑,希望你们中的某个人能解释一下。代码库太大而无法上传,但我会详细解释发生了什么:

我有一个类ProgessBar,它是一个包含秋千JProgressBarJDialog。我有一些 getter 和 setter 可以根据自己的喜好更改标准,但是问题来了。

ProgressBar 在 myButtonActionPerformed 方法中生成

myButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                myButtonActionPerformed(evt);
            }
        });

基本上当用户点击此按钮时,处理开始并产生ProgressBar

用户当前在他们面前有一个JFrame,并且这个进度条在JDialog 中弹出。在 Netbeans 中逐步调试模式后,我可以看到 JProgressBar 的值发生了变化,但是当我的程序正在处理时,条形图在视觉上保持在 0%,然后在离开上面的添加操作侦听器方法时立即跳转到 100% ,几乎就好像它正在等待重新绘制,直到从那个侦听器中出来。我不明白什么?有什么我可以调用的东西会强制它在这个 myButtonActionPerformed 方法中更新,而不是等到它没用。

【问题讨论】:

    标签: java user-interface swing jprogressbar


    【解决方案1】:

    您是否在 EDT 中花时间做任何事情?请记住,AWT/Swing 有一个专门的线程来执行 GUI 工作——处理事件处理程序、重新绘制 GUI 等。如果您在该线程上执行长时间运行的操作,Swing 将不会重新绘制。

    尝试在另一个线程中执行您的任务并相应地更新进度条。不过,请使用 SwingUtilities.invokeLaterinvokeAndWait 更新进度条,以确保在 EDT 上进行 GUI 更新。否则事情会变得很奇怪。

    【讨论】:

    • 非常感谢,这听起来很合理。我查了一些你给我的东西,发现这个链接对以后浏览这个论坛帖子的其他人很有用:java.sun.com/developer/technicalArticles/javase/swingworker/…
    • @Ryan:是的,我应该提到SwingWorker。道歉。是的,我想该链接将您引向正确的方向。
    【解决方案2】:

    它不更新的原因是因为您的 UI 线程正忙于 ActionPerformed 侦听器进行处理。如果您尝试与您的应用程序交互,您会注意到 UI 上没有任何响应。

    解决方案是不在 UI 线程上进行处理 - 启动另一个线程,对其进行处理,然后回调 UI 线程以更新进度条。

    【讨论】:

      【解决方案3】:

      首先,您的匿名 ActionListener 只是简单地转发到一个名为 myButtonActionPerformed 的方法,因此显然问题不在于发布的代码,而在于 myButtonActionPerformed 内部发生或导致发生的某些事情。所以这将是要发布的相关代码(如果可能的话)。

      第二个其他人可能已经确定了这一点,因为可能的事情确实是 EDT 上的繁重处理。可以使用 SwingWorkers 将进度/状态更新有效地路由到 GUI 线程,并将后台处理移出 EDT。

      第三:出于兴趣,您是否碰巧使用 NetBeans 进行 GUI 设计?对我来说,它看起来像是自动生成的代码。

      【讨论】:

      • 是的,我也使用 netbeans 进行设计。
      猜你喜欢
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      相关资源
      最近更新 更多