我需要在运行时将30个JPanel
添加到一个大的JPanel
(具有FlowLayout
布局管理器)。我想在添加完所有内容的最后显示添加的面板,所以我在末尾显示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();
}
}
最佳答案
仅从EDT(事件调度线程)更改您的Swing组件,从其他任何线程中添加/删除组件会导致不确定的行为,并可能导致很难跟踪竞争条件。
您应该使用诸如SwingUtilities.invokeLater()/ invokeAndWait()之类的调用来执行更改EDT上的GUI的代码。关于绘制,这也使您调用的代码也变得原子化(EDT绘制了GUI,因为在忙于更改代码时,它无法同时重新绘制)。