关于 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:抱歉,我不清楚你的意思 仅仅因为JFrameContainer 延伸(间接),你不能做new JFrame().add(new JFrame())。 API 不允许您这样做。但它允许您添加从ContainerComponent 扩展的其他对象,例如JPanel,您可以执行new JFrame().add(new JPanel())... @MadProgrammer: 但我可以有 new JPanel().add(new JPanel()) 和 JComponent 一样,对吧? 是的。这就是重点。您可以将任何类型的ContainerComponent 添加到Container,除非Window 是或从Window 扩展的任何内容,尽管WindowContainer 扩展... 【参考方案1】:

正如@MadProgrammer 在评论中所说,作者强调了对象层次结构告诉您的内容与 API 可以做什么之间的差异。 JFrame 和 JDialog 是***容器。如果您仔细查看层次结构,这些***容器不会继承 JComponent。取而代之的是它们继承自 AWT Window,这使得这些***容器在摇摆中具有特殊性,并使其成为重量级组件。所以这些重量级的***容器不能放置在另一个容器或组件内。 所有扩展 JComponents 的组件都是轻量级组件。此时,所有轻量级组件都可以放置在另一个轻量级组件或***容器中。

如果我出错了,请告诉我... :)

【讨论】:

以上是关于关于 Java Swing 中组件类的继承层次结构的说明?的主要内容,如果未能解决你的问题,请参考以下文章

Java详解菜单组件

《Java Swing》第5节:常用组件

swing类的类名都以大写字母啥开头

当在其层次结构中具有菱形继承的类的多重继承时,函数的模糊继承

2018-03-19面试之下面关于Java Swing的描述,说法错误的是?

Java学习笔记7.3.1 用户界面 - Swing常用组件