Java 为什么可以';我不能验证JComponent吗?

Java 为什么可以';我不能验证JComponent吗?,java,swing,layout,jcomponent,Java,Swing,Layout,Jcomponent,发件人: public void validate() 验证此容器及其所有子组件。验证容器意味着布置其子组件 这就是我想做的。使用尽可能轻的组件。但是当我使用JComponent执行此操作时,调用validate()不会使组件“有效” 为什么我不能使JComponent有效?文档中的内容是: 当组件在其父容器中的大小和位置正确且其所有子组件也有效时,该组件才有效 在到达(JFrame、JInternalFrame或JApplet)之前,情况一直如此。在您问题中的示例中,您的JComponent没

发件人:

public void validate()

验证此容器及其所有子组件。验证容器意味着布置其子组件

这就是我想做的。使用尽可能轻的组件。但是当我使用
JComponent
执行此操作时,调用
validate()
不会使组件“有效”

为什么我不能使
JComponent
有效?

文档中的内容是:

当组件在其父容器中的大小和位置正确且其所有子组件也有效时,该组件才有效


在到达(
JFrame
JInternalFrame
JApplet
)之前,情况一直如此。在您问题中的示例中,您的
JComponent
没有父组件,因此它永远不会有效。

java.awt.Component.isValid()的Javadoc声明:

当组件在其父容器中的大小和位置正确且其所有子组件也有效时,该组件才有效


简而言之,在将组件添加到容器中之前,您无法验证该组件。

若要将答案中所述内容相加,请不要忘记重写
getPreferedSize()
方法以返回您的组件首选大小。否则布局管理器将不会定位您的
JComponent
,因此将不会显示。

JComponent
是一个
容器
。但是
JComponent
是一个
容器
,如果始终需要父容器,则需要无限多个容器。是的,它是一个容器,但是它必须有一个父级,直到您到达TopLevelContainer()。好的,谢谢。这很糟糕:(你应该把它添加到你的答案中。但是,
validate()
应该可以工作,因为我想它只布局子组件。请看这里+1@mKorbel:这个答案没有向我解释任何事情。放在那里是有效的&getSize&Whatever@mKorbel:什么?我不明白你想说什么。Chris似乎是对的,你需要一个顶级容器才能使用
validate()
,否则当我调用它时它什么也不做。
    JComponent c = new JComponent() {};
    System.out.println(c.isValid()); // false
    c.validate();
    System.out.println(c.isValid()); // false