web-dev-qa-db-ja.com

JFrameを拡張するか、プログラム内で作成するか

Swingを使用してアプリケーションを作成するとき、人々がJFrameを作成するために2つのことのいずれかを行うのを見てきました。どちらがより良いアプローチであり、その理由は何ですか?

私はJavaとプログラミングの初心者です。私の唯一の学習ソースは、本、YouTube、StackOverflowです。

import {imports};

public class GuiApp1 {

    public static void main(String[] args) {

        new GuiApp1();
    }

    public GuiApp1()  {
        JFrame guiFrame = new JFrame();

        guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        guiFrame.setTitle("Example GUI");
        guiFrame.setSize(300,250);
        ................
    }

そして

import {imports};

public class GuiApp1 extends JFrame {

    public Execute() {
        getContentPane().setBackground(Color.WHITE);
        getContentPane().setLayout(null);
        setSize(800, 600);
        .............
    }

    public static void main(String[] args) {
        Execute frame1 = new Execute();
        frame1.setVisible(true);

    }
}
27
satnam

考え:

  • GUIをJFrameに結び付けるため、JFrameを拡張することは避けてください。代わりにJPanelの作成に集中する場合は、JFrame、JDialog、JApplet、または別のJPanel内、またはCardLayoutを介して他のJPanelと交換するなど、必要な場所でこれらのJPanelを自由に使用できます。
  • 一般に、特に複雑なクラスの継承は避けてください。これにより、不注意によるメソッドのオーバーライドなどの有害なエラーを防ぐことができます(getX()メソッドとgetY()メソッドを持つJFrameまたはJPanelを作成してみてください!)。
  • IDEを使用している場合は、複雑なクラスの継承を回避します。複雑なクラスをオーバーライドする場合、これらのクラスのオブジェクトでメソッドを呼び出すと、提供されるメソッドの選択肢が多すぎます。
  • カプセル化は優れており、より安全なコードの作成を可能にします。露出する必要があるものだけを露出し、その露出を可能な限り制御します。

優先 継承よりも構成

2番目の例では継承を使用していますが、JFrameの機能を変更しないため、正当な理由はありません。


余談ですが、これらが表示されているコードの例である場合は、新しいソースを見つけてください1補足。示されている数行のコードでも、それぞれが非常に疑わしいことを行っています。例えば。

  1. どちらのGUIも、イベントディスパッチスレッドでは作成されません。
  2. getContentPane().setBackground(Color.WHITE); getContentPane().setLayout(null); setSize(800, 600);
    • Java 1.5)以降、1行目の最初の部分(getContentPane())は必要ありません。
    • 2行目はnullレイアウトを使用しています。これは、数えたり説明したりできる方法で壊れます。
    • 3行目はpack();に置き換えるのが最適です。
  3. JFrame guiFrame = new JFrame(); guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); guiFrame.setTitle("Example GUI"); guiFrame.setSize(300,250);
    • 1行目と3行目は、次のように契約できます。
      JFrame guiFrame = new JFrame("Example GUI");
    • 2行目はguiFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);に設定する方が適切です
    • 3行目でも、フレームのサイズが設定されています。

補足

  1. あなたがSOを検索すると言ったので、ここにヒントがあります。 Swing top users の回答のトップ15プロバイダーの投稿をチェックしてください。あなたがこれらの人々から集めたアドバイス/コードが何であれ、それらのコードサンプルに間違いがあったとしてもほとんどコミットしません。

    私たちの数人が一般的に提供しているような自己完結型の例を提供しない(またはこれまでにない)人もいます(そしてそれらに目を向けません)必然的にOO単なる技術ではなく設計)の例ですが、提供するコードやアドバイスはすべて、十分に検討する必要があります。
18
Andrew Thompson

個人的には、最初のアプローチ(JFrameのインスタンスを作成する)が好まれます。私はこれを好むのは...

アプリケーションを専用のコンテナにロックすることはありません...フレームにアプレットを追加したり、アプレットにフレームを追加したりする人がたくさんいます。GUIの大部分をJPanelに単純に配置した場合そもそも、これらの問題は発生しません。

また、作成するUIがはるかに柔軟であることも意味します。たとえば、現在のアプリケーションでも将来のアプリケーションでも、自分を閉じ込めることなく再利用できます。

JFrameを拡張する際の主な不満は、実際には新しい機能を追加していないことです。これは、setVisibleを使用する以外に効果的に再利用できます。

JFrameを拡張する際に私が抱えるもう一つの問題は、人々がすぐにPaintをオーバーライドすることです。これは、本当に本当に悪いことです。これを行うことには非常に多くの問題があり、それらを繰り返しリストしなければならないのは単に苦痛です...

だから... 2セント以上の価値があります。 JFrameのインスタンスを作成し、それにコンテンツを追加します。必要に応じて、staticメソッド呼び出しshowMyAwesomeGUIを作成します。

10
MadProgrammer

最初のアプローチの方が優れています。

通常、フレームに新しい機能を追加することはないため、クラスの直接インスタンスを作成することは理にかなっています。

8
Reimeus

最初のアプローチに進みます。

これにより、より多くのフレームを作成できるようになります。アプリケーションは複数のウィンドウを持つことができるためです。 2番目の場合と同様に、これ以上フレームを作成することはできません。

1
ravi.patel