【问题标题】:Visual inheritance in JavaJava中的视觉继承
【发布时间】:2026-01-07 21:15:01
【问题描述】:
我所在的团队在 Java 平台中表单的视觉继承方面遇到了问题。
我们想要开发一个包含一些控件的基本 JFrame,并从该基本 JFrame 继承表单。 Netbeans 6.1 的设计者不会在继承的控件中绘制基本窗体的控件,因此我们不能以我们想要的方式使用它。在执行时,继承的表单被很好地绘制,并带有父控件。
Netbeans 设计师
有人解决了吗?我们应该更换 IDE 吗?
【问题讨论】:
标签:
java
swing
ide
netbeans
visual-inheritance
【解决方案1】:
AFAIK,马蒂斯并不是真正旨在创建继承的形式。它是为组合而设计的(即创建一个自定义 JComponent 并将其放入您的 Matisse 表单中)。
表单设计器不使用 java 文件来创建表单,它使用“form”文件。这不会被继承。如果您绝对需要使用继承(我不建议这样做),那么您需要将“表单”文件的内容复制到您的子类中。
一般来说,您应该创建某种类型的自定义 JPanel(使用或不使用 Matisse),然后将此表单放入您的 JFrame。任何需要重用的自定义代码/事件都应该附加到 JFrame 中,应该在 bean 中创建,然后添加到表单中。
Netbeans 7 正在考虑改进 Matisse 的代码生成。我建议将此作为增强请求发送至www.netbeans.org。
【解决方案2】:
只是一般性评论,而不是对您的情况的真正回答 - 视觉组件不是为了继承而制作的。例如,查看 Sun 通过从 Component 继承所有内容所犯的可怕错误 - 现在您有一个无法使用 .add() 向其中添加项目的 JList。除非您可以履行整个超类契约(我只知道几个可以)更喜欢组合而不是继承。公开您计划实现的方法和“组件 getAsComponent()”方法,并明确声明不应直接更改组件。我发现这比思考“如果有人在我的组件中使用 add(JLabel) 或 setLayout() 该怎么办?”要容易得多。
关于您的具体困境 - 我在 IntelliJ IDEA 中使用 JFormDesigner,但它也可能适用。 JFD 有一种使用组件 BeanInfo 信息的好方法(对于名为“MyThingy”的组件,信息类将是“MyThingyBeanInfo”)。使用该类,您可以定义许多仅在设计时使用的东西,以及特殊的绘画方法和其他细节。
【解决方案3】:
Jaguard,你必须更改访问var控件(右键单击控件,选择'customize code',见窗口底部)