2012-05-05 52 views
1

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

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

我可以发布代码,如果你喜欢,请直接指向我想要的代码(IE XML解码器和循环,JLabel的添加和大小,实例化等)。

回答

2

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

欲了解更多信息,请查看名为Concurrency in Swing的Java Swing教程。它将描述事件线程,为什么重要的是要尊重而不是阻止,以及如何使用SwingWorker对象进行后台处理。

2

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

+0

好的,我有我的JProgressBar实现这个概念(代码在http://stackoverflow.com/questions/10450571/how-can-i-make-a-progress-bar-class-thats-value-can-从呼叫更新到底部),我的问题是这是什么?我在类中猜测“在窗格上添加”JLabel,或者它会在我实例化JPanel的地方。再次,我是新的,学习和欣赏的帮助。 –

+0

@JesterHawk我会给您的原始问题添加一个示例,可能有用。 –