我需要在运行时将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,因为在忙于更改代码时,它无法同时重新绘制)。

10-06 09:19