我有一个JPanel,我正在添加JLabel。然后我想删除所有JLabel并添加一些新的。
所以我做了以下事情:
panel.removeAll();panel.repaint();
panel.add(new JLabel("Add something new");
panel.revalidate();
这很好用。当我在此之后开始一个新线程时出现问题:
panel.removeAll();panel.repaint();
(1)panel.add(new JLabel("Add something new");
panel.revalidate();
//new thread to start - this thread creates new JLabels that should appear under (1)
firstProducer.start();
try {
firstProducer.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
然后原始JLabel的输出仍然可见。我已经读过,重新验证过程是一个长时间运行的任务,因此firstProducer线程正在开始 重新验证正在进行,并且正在发生冲突。解决这个问题的最佳方法是什么?
答案 0 :(得分:4)
问题是firstProducer.join
。如javadoc中所述
等待此线程死亡。
因此,在您的其他Thread
完成之前,您将阻止事件调度线程,因此无法重新绘制或重新验证该面板,并且您不会在UI中看到您的更改。
有关详细信息,请参阅Swing concurrency tutorial