关于 Java Swing 中组件类的继承层次结构的说明?
Posted
技术标签:
【中文标题】关于 Java Swing 中组件类的继承层次结构的说明?【英文标题】:clarification on inheritance hierarchy for the component class in Java Swing? 【发布时间】:2014-02-03 08:29:07 【问题描述】:我在 Swing 上阅读 Core Java Volume 1
。我很难理解这一段:
首先,作者说
组件可以放置在面板等容器中。容器 可以自己放在其他容器中,所以类容器 扩展组件。图 9.8 显示了继承层次结构 组件,
注意:不幸的是,继承层次结构有些不干净 在两个方面。首先,JFrame等***窗口是 容器和组件的子类,但它们不能是 放在其他容器内。此外,JComponent 是一个 Container 的子类,而不是 Component。因此可以添加其他 组件到 JButton 中(但是,这些组件不会 显示)。
在我看来,他在照片前后的陈述似乎是相反的。 我也无法清楚地理解作者在这里想说什么。 如果有人可以用一个例子或其他东西详细说明,那将很有用 谢谢
【问题讨论】:
这可能只关注一个元素,但本质上,只是因为JFrame
扩展自 Frame
,而 Window
扩展自 Container
(扩展自 Component
),您可能会假设您可以将一个 JFrame
添加到另一个。但你不能。这是组件中的一个限制,以防止您这样做。他强调了对象层次结构告诉您的内容与 API 可以做什么之间的差异......所以是的,这是矛盾的,因为它必须如此。
@MadProgrammer:抱歉,我不清楚你的意思
仅仅因为JFrame
从Container
延伸(间接),你不能做new JFrame().add(new JFrame())
。 API 不允许您这样做。但它允许您添加从Container
或Component
扩展的其他对象,例如JPanel
,您可以执行new JFrame().add(new JPanel())
...
@MadProgrammer: 但我可以有 new JPanel().add(new JPanel()) 和 JComponent 一样,对吧?
是的。这就是重点。您可以将任何类型的Container
或Component
添加到Container
,除非Window
是或从Window
扩展的任何内容,尽管Window
从Container
扩展...
【参考方案1】:
正如@MadProgrammer 在评论中所说,作者强调了对象层次结构告诉您的内容与 API 可以做什么之间的差异。 JFrame 和 JDialog 是***容器。如果您仔细查看层次结构,这些***容器不会继承 JComponent。取而代之的是它们继承自 AWT Window,这使得这些***容器在摇摆中具有特殊性,并使其成为重量级组件。所以这些重量级的***容器不能放置在另一个容器或组件内。 所有扩展 JComponents 的组件都是轻量级组件。此时,所有轻量级组件都可以放置在另一个轻量级组件或***容器中。
如果我出错了,请告诉我... :)
【讨论】:
以上是关于关于 Java Swing 中组件类的继承层次结构的说明?的主要内容,如果未能解决你的问题,请参考以下文章
当在其层次结构中具有菱形继承的类的多重继承时,函数的模糊继承