2010-07-01 52 views
3

我有一个GUI问题,我想要整理出来,但我很困惑,发生了什么,希望你能解释它。代码基地太大,无法上传,但我会详细解释发生了什么事情:Java GUI JProgressBar没有绘画

我有一个类ProgessBar这是一个JDialog包含一个摇摆JProgressBar。我有一些getters和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方法内更新,而不是等到它没用。

回答

5

你在美国东部时间做任何事情吗?请记住,AWT/Swing有专门的线程来完成GUI工作 - 处理事件处理程序,重绘GUI等。如果您在该线程上执行长时间运行的任务,Swing将不会重新绘制。

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

+0

非常感谢,这听起来很合理。我查了一下你给我的一些东西,发现这个链接对将来通过这个论坛主题进行查看的任何人都很有用:http://java.sun.com/developer/technicalArticles/javase/swingworker/#EDT – Ryan 2010-07-01 03:20:39

+0

@瑞恩:是的,我应该提到'SwingWorker'。道歉。是的,我想这个链接可以让你在这里找到正确的方向。 – Joey 2010-07-01 03:31:31

1

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

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

1

首先,您的匿名ActionListener只是转发到一个名为myButtonActionPerformed的方法,显然这个问题不在发布的代码中,而是发生在或发生在myButtonActionPerformed内部的事件中。所以这将是相关的代码发布(如果可能)。

其他人可能已经钉住了这一点,因为美国东部时间可能确实是重度加工。可以使用SwingWorkers将进度/状态更新有效地路由到GUI线程,并将背景处理从EDT移开。

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

+0

是的,我也使用netbeans进行设计。 – Ryan 2010-07-01 03:52:13