我们有一些代码实现如下:
@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
这样做有什么特殊原因吗?对我来说,这似乎违反了“最小惊喜原则”......
最佳答案
Is there some particular reason why Container behaves this way?
默认情况下,所有 Swing 组件的默认大小均为 (0, 0),因此无需绘制任何内容。
调用布局管理器时,组件会被赋予尺寸(和位置)。由于您可以向面板添加多个组件,因此在添加每个组件时不断调用布局管理器是没有意义的。
因此,当您完成向面板添加组件后,您将执行以下操作:
panel.revalidate(); // to invoke the layout manager
panel.repaint(); // not always needed, but will ensure the panel is repainted.
关于java - 为什么在将组件添加到容器时 AWT/Swing 不自动重绘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44961393/