我的Swing组件图形没有更新

时间:2012-05-05 18:13:34

标签: java swing jpanel jscrollpane jlabel

我意识到没有代码这可能很难回答,但问题是我不确定要发布什么代码。我的问题是,当我加载XML文件时,解组它然后迭代加载的值的ArrayList以重新填充放置在JScrollPane内的JPanel上的JLabel数组,图形在整个处理完成之前不会更新。当我创建一个用JProgressBar打开的JFrame时,我发现了这一点。在完成所有操作之前,条形图甚至不会在窗格框架上显示或绘制。这打败了目的,因为我试图让进度条显示解码的进度。在调试时,我发现如果我隔离了代码(除了实际加载文件和进行解组),该工作就可以了。这让我看起来,我注意到所提到的其他组件在添加和调整各个JLabel时都没有更新,直到所有过程完成,尽管不断重新绘制。由于我还是JAVA的新手,我想我会问是否有人可能知道这个循环正在进行时所有这些组件都不会以图形方式更新的原因。

作为一个注释,在循环中,我调用add和repaint函数将新解码的JLabel放置在窗格上,但是直到完成后才会显示,就像条形图一样。所有这些都是运行单线程(除了JProgressBar,它旋转到它自己的线程).ll

如果您愿意,我可以发布代码,请指导您使用您想要的代码(IE解码器和循环,JLabel的添加和大小,实例化等)。

2 个答案:

答案 0 :(得分:2)

您正在使用“事件调度”线程进行工作,该线程与用于运行swing的线程相同。 你需要在一个单独的线程中完成你的工作。 Take a look at the SwingWorker class

答案 1 :(得分:2)

您的问题是您正在Swing事件线程或EDT上进行所有处理。解决方案是使用后台线程,例如可以通过SwingWorker对象获取。

有关详细信息,请查看名为Concurrency in Swing的Java Swing教程。它将描述事件线程,尊重和不阻止的重要性,以及如何使用SwingWorker对象进行后台处理。