2009-12-30 140 views
0

我想用一个扩展JFrame来构建一个GUI的类。当超类扩展JFrame

例如:类甲板扩展的JFrame

的GUI是建立在其构造。

现在,当我从另一个类延长甲板,

例如:类桩扩展甲板每当子类(桩)的实例启动正在创建

新窗口。

发生这种情况是因为子类继承了超类的构造函数,因此创建了另一个窗口?

如果不修改Deck超类,可以避免这种情况吗?

谢谢。

+1

不必要的子类化(几乎总是使用'JFrame'和'JPanel')通常是一个坏主意。 – 2009-12-30 14:40:36

+0

如果它造成的问题,你需要重新考虑,如果甲板真的需要扩展JFrame,答案可能是它不会 – willcodejavaforfood 2009-12-31 12:27:32

回答

2

这是发生因为子类 是继承父类的构造函数 并因此创造 另一个窗口?

是的。你扩展一个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未创建。

我不确定你为什么要这样做,所以也许你可以添加更多的信息来清除。

+0

谢谢我会尝试。基本上我想用其他类中Deck中创建的GUI组件。目前我正在通过使这些组件变量成为静态并通过使用Deck.JPanel1从其他类访问它们来解决它。但我认为有更好的方法去做... – Kari 2009-12-30 09:29:11

1

不。总是调用超级构造函数。

但是,由于您扩展了JFrame,不创建窗口的意义何在? 您可以在Pile的构造函数中使用setVisible(false)来隐藏它,但这很奇怪。

您应该重新定义您的继承层次结构。

+0

是否可以重写超类的构造函数? – Kari 2009-12-30 08:57:26

+1

@Kari:不。超级构造函数将在您的构造函数被调用之前隐式调用。请提供更多信息,说明为什么要扩展课程但不使用其行为。 – 2009-12-30 09:10:13

1

其发生的原因是子类继承了超类构造函数。在任何子类中总是调用第一个超类构造函数。

0

做你想做的事的唯一方法就是编辑Deck类。

一个简单的方法就是在你的超类(init())或其他东西中创建一个新方法,并将所有代码放在那里而不是你的构造函数中。然后用空方法(或你自己的)覆盖子类中的init()方法。您可以使用参数(如yourConstructor(boolean doNothing))在您的父类中创建一个新的构造函数。然后你在你的子类中调用这个构造函数,所以它只执行那个,而不是你的默认构造函数。