2012-05-04 12 views
8
JFrameのを拡張 ではなく、の長所と短所は何

が新しいJFrameのを作成しますか?拡張のJFrame

例えば:

public class Test extends JFrame { 

setVisible(true); 

} 

または

public class Test { 

JFrame test = new JFrame(): 

test.setVisible(true); 

} 

答えて

9

あなたが実際にその機能を拡張する場合を除き、あなたはあなたが示してきた例では、クラスを拡張するべきではありません、あなたはオプションを使用する必要があります2、オプション1は機能の乱用です。

言い換えれば - 質問の回答がテストa JFrameである限り、です。です。JFrameには拡張しないでください。 (そのことについてまたは任意のSwingコンポーネント)のJFrameを拡張していないの

+1

アーメン、と100%1+の議決に同意します。 –

+0

拡張クラスにいくつかのメソッドを追加すると、JFrameを拡張しないのですか?それに返信してください。オプション1が拡張機能を悪用するのはなぜですか?彼はsetVisibleというメソッドをオーバーライドしていませんでした。継承されたメソッドを呼び出すことができないということですか? 潜在的なサブクラスが心配な場合、拡張JFrameをファイナライズしないのはなぜですか? ウィンドウであれば、JFrameを拡張してウィンドウを作成するのは間違っているとは思えません。 –

+0

私はより良い理解を得ようとしています。学校の例:学生が人を拡張する。学生はログインするオプションを持っていますが、Personはそうではありません。ウィンドウ "NewTask"は、フォームに従って新しいタスクを作成するための機能を提供しますが、JFrameは機能しません。 –

8

長所:

  • は、意図しない方法のオーバーライドを避けてください。私はクラスint getX()int getY()メソッドを与えたとき、私はこれを何度も踏んできました。試してみると、それほど面白くない異常な行動がいくつか見られます。
  • EclipseまたはNetBeansを使用して作成したメソッドのみに使用できるメソッドオプションを簡略化します。これは実際に私の好む利点です。
  • GUIにJFramesではなくJPanelを作成すると、展開の柔軟性が100倍に向上します。
  • 最も重要なのは、露出が必要なものだけを露出させることです。
+0

私はポイント3が好きなので、+1します。 – Jasonw

+2

*「JFramesではなくJPanelを作成するためにGUIを装備する」*もちろん、カスタムペイントの振る舞いなどを実装しない限り、パネルを拡張するのと同じトラップには入らないように注意してください。 –

+1

私の意見では、ポイント4が最も重要です。 +1 –

0

OODのルールの1つ:クラスを継承(拡張)できない場合は、継承しません。

継承により、プログラムの複雑さと接続性が向上し、新しいエラーが発生する可能性があります。あなたの場合、クラスを拡張する理由はありません。

保護されたメンバーにアクセスしたり、多態的な動作(仮想メソッドをオーバーライド)する必要がある場合にのみ、クラスを拡張する必要があります。

+0

* "あなたはクラスを継承しません" *彼らは何ですか?あなたは私に次の言葉にぶら下がっているんだ;) –

2

JFrameを拡張する場合は、現在のJframeクラス を変更/カスタマイズしたいので、このカスタム実装をサブクラスで使用できます。

もしそこに私はJFrameのクラスに変更をしたい何も、ちょうど使用あなたのコードに与えてくれた第二のスニペットのように、既存の 。使い方は、JPanelに他のJComponent(例ではボタン/ラベル)を作成し、 というオブジェクトを作成し、JFrame contentPaneをこのオブジェクトに設定することを意味します。何か のように

public class Test extends JPanel { 

    public class() { 
    // add buttons/label here 
    } 
    ... 

    private static void createAndShowGUI() { 
     JFrame frame = new JFrame(); 

     Test object = new Test(); 
     frame.setContentPane(object.setOpaque(true)); 

     frame.setVisible(true); 
    } 
... 
}