3

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

我有ProgessBar一个JDialog包含 swing的类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's 的值发生了变化,但是当我的程序正在处理时,条形图在视觉上保持在 0%,然后在离开上面的添加动作侦听器方法时立即跳转到 100%,几乎就像如果它正在等待重新绘制直到离开那个听众。我不明白什么?有什么我可以调用的东西会强制它在这个myButtonActionPerformed方法内部更新,而不是等到它没用。

4

3 回答 3

5

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

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

于 2010-07-01T03:15:23.720 回答
1

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

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

于 2010-07-01T03:14:45.803 回答
1

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

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

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

于 2010-07-01T03:23:35.567 回答