0

JFrameを拡張するクラスを使用してGUIを構築しようとしています。

例:クラスデッキはJFrameを拡張します

GUIはコンストラクターに組み込まれています。

別のクラスからデッキを拡張すると、

例:クラスパイルはデッキを拡張します

サブクラス(Pile)のインスタンスが開始されるたびに、新しいウィンドウが作成されます。

これは、サブクラスがスーパークラスコンストラクターを継承しているため、別のウィンドウを作成しているために発生していますか?

デッキスーパークラスを変更せずにこれを回避できますか?

ありがとう。

4

4 に答える 4

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それを拡張するので、それでも最終的にはaになりますが、 Deck-classの子コンポーネントは作成されません。

なぜこれを実行したいかわからないので、明確にするためにさらに情報を追加できるかもしれません。

于 2009-12-30T08:48:29.183 に答える
1

いいえ。スーパーコンストラクターは常に呼び出されます。

しかし、拡張するのでJFrame、ウィンドウを作成しないことのポイントは何ですか?のコンストラクタを使用setVisible(false)して非表示にすることができますが、それは奇妙なことです。Pile

継承階層を再定義する必要があります。

于 2009-12-30T08:48:55.103 に答える
1

サブクラスがスーパークラスコンストラクターを継承しているために発生します。どのサブクラスでも、常に最初のスーパークラスコンストラクターが呼び出されます。

于 2009-12-30T08:50:52.020 に答える
0

必要なことを行う唯一の方法は、Deck クラスを編集することです。

これを行う簡単な方法は、スーパークラス ( init() ) などで新しいメソッドを作成し、コンストラクターの代わりにすべてのコードをそこに配置することです。次に、サブクラスの init() メソッドを空のメソッド (または独自のメソッド) で上書きします。

または、yourConstructor(boolean doNothing) のように、パラメーターを使用してスーパークラスに新しいコンストラクターを作成することもできます。次に、サブクラスでこのコンストラクターを呼び出して、デフォルトのコンストラクターではなく、そのコンストラクターのみを実行します。

于 2012-01-20T20:11:44.727 に答える