我正在尝试使用扩展 JFrame 的类来构建 GUI。
例如:Deck 类扩展了 JFrame
GUI 内置于其构造函数中。
现在,当我从另一个类扩展 Deck 时,
例如:类桩扩展甲板
每当启动子类(桩)的实例时,都会创建新窗口。
发生这种情况是因为子类继承了超类构造函数并因此创建了另一个窗口吗?
在不修改 Deck 超类的情况下可以避免这种情况吗?
谢谢。
发生这种情况是因为子类继承了超类构造函数并因此创建了另一个窗口吗?
是的。你扩展 a JFrame
,所以你得到 a JFrame
。
super()
总是在你自己的构造函数之前被隐式调用,除非你super(...)
自己调用this(...)
。这需要是您自己的构造函数中的第一次调用。
如果你真的想要这种行为,你可以在你的基类 ( Deck
) 中编写另一个构造函数,如下所示:
public class Deck extends JFrame {
public Deck(boolean createContent) {
if( createContent ) {
getContentPane().add(...);
// ...
}
}
public Deck() {
this(true);
}
}
public class Pile extends Deck {
public Deck() {
super(false);
// ...
}
}
你仍然会得到 a ,JFrame
因为你扩展了它,但是你的Deck
-class 的子组件没有被创建。
我不确定你为什么要这样做,所以也许你可以添加更多信息来清除。
不,超级构造函数总是被调用。
但是既然你扩展JFrame
了,那么不创建窗口有什么意义呢?您可以使用setVisible(false)
inPile
的构造函数将其隐藏,但这会很奇怪。
您应该重新定义继承层次结构。
是的,因为子类继承了超类构造函数。在任何子类中,总是调用第一个超类构造函数。
做你想做的唯一方法是编辑 Deck 类。
一个简单的方法就是在你的超类(init())或其他东西中创建一个新方法,然后把你所有的代码放在那里而不是你的构造函数。然后用空方法(或您自己的)覆盖子类中的 init() 方法。
或者你可以在你的超类中创建一个带有参数的新构造函数,比如 yourConstructor(boolean doNothing)。然后你在你的子类中调用这个构造函数,所以它只执行那个而不是你的默认构造函数。