1

我需要在运行时将 30JPanel秒添加到一个大的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();
    }
}
4

1 回答 1

3

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

您应该使用 SwingUtilities.invokeLater()/invokeAndWait() 之类的调用来执行更改 EDT 上的 GUI 的代码。关于绘制,这也使您调用的代码具有原子性(EDT 绘制 GUI,因为当它忙于执行更改代码时,它不能同时重新绘制)。

于 2013-02-18T15:51:23.200 回答