Java GUI JProgressBar没有绘画

时间:2010-07-01 03:08:14

标签: java user-interface swing jprogressbar

我有一个GUI问题,我想整理出来,但我对于发生了什么感到困惑,希望你们中的一个人能解释一下。代码库太大而无法上传,但我会详细解释发生了什么:

我有一个ProgessBar课,这是JDialog,包含一个摆动JProgressBar。我有一些吸气剂和制定者可以根据自己的喜好改变标准,但问题就出现了。

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方法内更新,而不是等到它没用。

3 个答案:

答案 0 :(得分:5)

你在EDT那段时间做什么?请记住,AWT / Swing有一个专门的线程来完成GUI工作 - 处理事件处理程序,重新绘制GUI等。如果你在该线程上进行长时间运行,Swing将不会重新绘制。

尝试在另一个线程中执行您的任务并相应地更新进度条。但是,使用SwingUtilities.invokeLaterinvokeAndWait更新进度条,以确保在EDT上进行GUI更新。事情变得非常奇怪。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

首先,你的匿名ActionListener只是转发到一个名为myButtonActionPerformed的方法,所以显然问题不在于发布的代码中,而是在myButtonActionPerformed中发生或导致发生的事情。这就是要发布的相关代码(如果可能的话)。

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

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