我们有一些代码实现如下:
@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
只是JPanel
而CardPanel
只是我们自己的界面之一,但所有卡片面板都只使用普通的Swing组件。
这个评论令人费解,因为据我所知,如果添加了一个孩子,Container#add
应该自动重绘自己。然而,如果我删除该行,实际上我确实看到它在添加子项时不会重新绘制其内容。
Container
行为方式有什么特别的原因吗?对我来说,它似乎违反了“最不惊讶的原则”......
答案 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.