为什么JPanel自动重绘?

时间:2013-02-18 14:51:08

标签: java swing user-interface jpanel

我需要在运行时向大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();
    }
}

1 个答案:

答案 0 :(得分:3)

仅从EDT(事件调度线程)更改Swing组件,从任何其他线程添加/删除组件会导致未定义的行为,并且可能非常难以跟踪竞争条件。

您应该使用类似SwingUtilities.invokeLater()/ invokeAndWait()的调用来执行改变EDT上GUI的代码。关于绘画,这也使你的被调用代码成为原子(EDT绘制GUI,因为当它忙于驱逐你的改变代码时,它不能同时重绘)。