Java GUI JProgressBar没有绘画

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

我有一个ProgessBar类,它是一个包含swing JProgressBarJDialog 。 我有一些吸气剂和制定者可以根据自己的喜好改变标准,但问题就出现了。

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

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

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

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

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

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

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

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