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

标签 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 这样做有什么特殊原因吗?对我来说,这似乎违反了“最小惊喜原则”......

最佳答案

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/

相关文章:

java - 阻止 JTextPane 接收新换行符

java - 如何嵌入我的秒表

java - 按 RecyclerView 的值升序/降序排序

java - 停止接收所有 ActionEvents/停止在 Java 中监听一段时间?

java - 为什么 java.lang.process 的 readline() 在读取具有相同操作系统的不同机器上的输入流时表现不同

java - 在java中为形状创建boundingBox - 用于选择、拖放、旋转、平移

Java KeyStroke.getKeyStroke 修饰符已更改

java - Java 中的字符串长度(以像素为单位)

java - Eclipse 在抛出 "Throwable during asyncExec Malformed class name"后崩溃

java - 为什么java的 String split ("\\s") 数组中有一个空字符串?