当超类扩展JFrame时

时间:2009-12-30 08:42:29

标签: java swing jframe extends

我正在尝试使用扩展JFrame的类来构建GUI。

ex:class Deck扩展了JFrame

GUI是在其构造函数中构建的。

现在当我从另一个班级扩展Deck时,

ex:class Pile扩展Deck

每当启动子类(桩)的实例时,都会创建新窗口。

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

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

感谢。

4 个答案:

答案 0 :(得分: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 - 类的子组件。

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

答案 1 :(得分:1)

没有。总是调用超级构造函数。

但是,自从你扩展JFrame以来,没有创建窗口的重点是什么? 您可以在setVisible(false)的构造函数中使用Pile隐藏它,但这很奇怪。

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

答案 2 :(得分:1)

Ya发生了,因为子类继承了超类构造函数。在任何子类中总是会调用第一个超类构造函数。

答案 3 :(得分:0)

执行所需操作的唯一方法是编辑Deck类。

一种简单的方法就是在你的超类(init())或其他东西中创建一个新方法,并将所有代码放在那里而不是你的构造函数。然后使用空方法(或您自己的方法)覆盖子类中的init()方法。

或者你可以使用参数在你的超类中创建一个新的构造函数,比如yourConstructor(boolean doNothing)。然后在子类中调用此构造函数,使其仅执行该构造函数而不是默认构造函数。