我有一个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
方法内更新,而不是等到它没用。
答案 0 :(得分:5)
你在EDT那段时间做什么?请记住,AWT / Swing有一个专门的线程来完成GUI工作 - 处理事件处理程序,重新绘制GUI等。如果你在该线程上进行长时间运行,Swing将不会重新绘制。
尝试在另一个线程中执行您的任务并相应地更新进度条。但是,使用SwingUtilities.invokeLater
或invokeAndWait
更新进度条,以确保在EDT上进行GUI更新。事情变得非常奇怪。
答案 1 :(得分:1)
它不更新的原因是因为你的UI线程忙于ActionPerformed监听器进行处理。如果您尝试与应用程序进行交互,您会注意到UI上的任何内容都没有响应。
解决方法是不在UI线程上进行处理 - 启动另一个线程,对其进行处理,然后回调UI线程来更新进度条。
答案 2 :(得分:1)
首先,你的匿名ActionListener只是转发到一个名为myButtonActionPerformed的方法,所以显然问题不在于发布的代码中,而是在myButtonActionPerformed中发生或导致发生的事情。这就是要发布的相关代码(如果可能的话)。
第二个人可能已经把这个问题钉了下来,因为可能的事情确实是EDT上的繁重处理。可以使用SwingWorkers将进度/状态更新有效地路由到GUI线程,并将后台处理移出EDT。
第三:出于兴趣,您是否碰巧将NetBeans用于GUI设计?看起来像是自动生成的代码给我。