为什么在将容器添加到容器时不会自动重绘AWT / Swing?

时间:2017-07-07 01:57:17

标签: java swing awt

我们有一些代码实现如下:

@Override
public void showPanel(CardPanel panel)
{
    cardPanel.removeAll();
    cardPanel.add((Component) panel);

    // Even though you'd think adding a component should automatically repaint,
    // it turns out that it doesn't.
    cardPanel.repaint();
}

cardPanel只是JPanelCardPanel只是我们自己的界面之一,但所有卡片面板都只使用普通的Swing组件。

这个评论令人费解,因为据我所知,如果添加了一个孩子,Container#add应该自动重绘自己。然而,如果我删除该行,实际上我确实看到它在添加子项时不会重新绘制其内容。

Container行为方式有什么特别的原因吗?对我来说,它似乎违反了“最不惊讶的原则”......

1 个答案:

答案 0 :(得分:2)

  

Container有这样一种特殊原因吗?

默认情况下,所有Swing组件的默认大小为(0,0),因此无需绘制任何内容。

调用布局管理器时,会为组件指定大小(和位置)。由于您可以向面板添加多个组件,因此在添加每个组件时不断调用布局管理器是没有意义的。

因此,当您完成向面板添加组件时,您可以:

panel.revalidate(); // to invoke the layout manager
panel.repaint(); // not always needed, but will ensure the panel is repainted.