我想用一个扩展JFrame来构建一个GUI的类。当超类扩展JFrame
例如:类甲板扩展的JFrame
的GUI是建立在其构造。
现在,当我从另一个类延长甲板,
例如:类桩扩展甲板每当子类(桩)的实例启动正在创建
新窗口。
发生这种情况是因为子类继承了超类的构造函数,因此创建了另一个窗口?
如果不修改Deck超类,可以避免这种情况吗?
谢谢。
我想用一个扩展JFrame来构建一个GUI的类。当超类扩展JFrame
例如:类甲板扩展的JFrame
的GUI是建立在其构造。
现在,当我从另一个类延长甲板,
例如:类桩扩展甲板每当子类(桩)的实例启动正在创建
新窗口。
发生这种情况是因为子类继承了超类的构造函数,因此创建了另一个窗口?
如果不修改Deck超类,可以避免这种情况吗?
谢谢。
这是发生因为子类 是继承父类的构造函数 并因此创造 另一个窗口?
是的。你扩展一个JFrame
,所以你得到一个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);
// ...
}
}
你仍然会结束与一个JFrame
,因为你扩展它,但子组件您的Deck
-class未创建。
我不确定你为什么要这样做,所以也许你可以添加更多的信息来清除。
谢谢我会尝试。基本上我想用其他类中Deck中创建的GUI组件。目前我正在通过使这些组件变量成为静态并通过使用Deck.JPanel1从其他类访问它们来解决它。但我认为有更好的方法去做... – Kari 2009-12-30 09:29:11
不。总是调用超级构造函数。
但是,由于您扩展了JFrame
,不创建窗口的意义何在? 您可以在Pile
的构造函数中使用setVisible(false)
来隐藏它,但这很奇怪。
您应该重新定义您的继承层次结构。
是否可以重写超类的构造函数? – Kari 2009-12-30 08:57:26
@Kari:不。超级构造函数将在您的构造函数被调用之前隐式调用。请提供更多信息,说明为什么要扩展课程但不使用其行为。 – 2009-12-30 09:10:13
其发生的原因是子类继承了超类构造函数。在任何子类中总是调用第一个超类构造函数。
做你想做的事的唯一方法就是编辑Deck类。
一个简单的方法就是在你的超类(init())或其他东西中创建一个新方法,并将所有代码放在那里而不是你的构造函数中。然后用空方法(或你自己的)覆盖子类中的init()方法。您可以使用参数(如yourConstructor(boolean doNothing))在您的父类中创建一个新的构造函数。然后你在你的子类中调用这个构造函数,所以它只执行那个,而不是你的默认构造函数。
不必要的子类化(几乎总是使用'JFrame'和'JPanel')通常是一个坏主意。 – 2009-12-30 14:40:36
如果它造成的问题,你需要重新考虑,如果甲板真的需要扩展JFrame,答案可能是它不会 – willcodejavaforfood 2009-12-31 12:27:32