我需要在运行时向大JPanel
(具有JPanel
布局管理器)添加30 FlowLayout
s。我想在最后添加所有面板时添加所有面板,所以最后我reValidate();
和rePaint();
但是大面板在添加时显示每个添加的面板,似乎它自动重新粉刷:
public class CalendarsManager implements Runnable
{
public CalendarsManager(int mode, DecorateCalendarContainer container)
{
status = mode;
containerPanel = container.getContainer();
dayPanelsCategory = container.getDayPanels();
}
public void run()
{
for(int i=1;i<=30;i++)
{
containerPanel .add(dayPanelsCategory);
}
containerPanel.revalidate();
containerPanel.repaint();
}
}
答案 0 :(得分:3)
仅从EDT(事件调度线程)更改Swing组件,从任何其他线程添加/删除组件会导致未定义的行为,并且可能非常难以跟踪竞争条件。
您应该使用类似SwingUtilities.invokeLater()/ invokeAndWait()的调用来执行改变EDT上GUI的代码。关于绘画,这也使你的被调用代码成为原子(EDT绘制GUI,因为当它忙于驱逐你的改变代码时,它不能同时重绘)。