web-dev-qa-db-ja.com

Java / Swing GUIのベストプラクティス(コードの観点から)

this wiki と対照的に、コーディングの観点からSwing GUIコントロールを実装する適切な方法を探しています。

私はJavaとそのGUIツールを学ぶために探求してきましたが、mainにすべてをスローするインターネットチュートリアルの後にインターネットチュートリアルを見つけましたが、これは正しくありません。

私もRAD Netbeansやその他の「ビジュアル」エディタなどのシステムを試しましたが、コーディングに着手するまでに、その半分がわからないコードのヒープがあります。そのため、コードスイングのハンドリングを学ぶことに専念しており、基本的なコントロールとレイアウトは知っていますが、正しい方法で実行したいと考えています。

不足しているモデルまたは標準はありますか?

質問例...

jFrameを拡張して独自のフレームオブジェクトを作成する方法(そうだと思います)

そのフレームオブジェクト内にメインメニューをカプセル化しますか?それとも独自に作成しますか?等...

「表示」ロジックを「アプリケーション」ロジックから分離するにはどうすればよいですか?

基本的に、GUIコードを整理する方法について、業界標準とは何かを探しています。

21
jondavidjohn

「ベストプラクティス」を構成するものについてはいくつかの議論があるようですので、私が見つけたものと私が最も効果的に機能することを説明します。

1.各ウィンドウは、JFrameまたはJDialog(ウィンドウのタイプに応じて)のいずれかを拡張する必要があります。これにより、毎回特定のオブジェクトを指定することなく、ウィンドウのプロパティを簡単に制御できます。ただし、私は両方の方法で行うことが知られているため、これはより一般的なケースです。

2. main()メソッドは別のクラスにある必要があります。これにより、ウィンドウクラスが特定の実装に関連付けられていないため、他の場所でウィンドウクラスを使用できる可能性が高くなります。技術的には違いはありませんが、アプリケーションの起動コードはウィンドウに属していません。

3.リスナーは匿名の内部クラスにある必要があります。トップレベルのクラスはリスナーを実装しないでください。これにより、接続されているオブジェクト以外の場所からリスナーメソッドを呼び出すようなハッキングが防止されます。

以下は、これらのプラクティスを示す単一のフレームを使用した単純なアプリケーションです。

public class Main {
    public static void main(String[] args) {
        final String text = args[0];
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                final MyWindow wnd = new MyWindow(text);
                wnd.setVisible(true);
            }
        });
    }
}

public class MyWindow extends JFrame {
    public MyWindow(String text) {
        super("My Window");

        setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                MyWindow.this.setVisible(false);
                MyWindow.this.dispose();
            }
        });

        final JButton btn = new JButton(text);
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(MyWindow.this, "Button Pressed", "Hey", JOptionPane.INFORMATION_MESSAGE);
            }
        });

        setLayout(new FlowLayout());
        add(btn);
        pack();
    }
}
36
Jonathan

ジョナサンのすべてのポイント に同意します。

  1. 各ウィンドウはJFrameまたはJDialogのいずれかを拡張する必要があります...

  2. Main()メソッドは別のクラスにある必要があります...

  3. リスナーは匿名の内部クラスにある必要があります...

以下も追加したいと思います。

  1. GridBagLayout(GBL)は慎重に使用してください。 GBLは強力なレイアウトマネージャであり、習得は困難ですが、非常に強力です。

  2. すべてのUIを手動でコーディングすることを検討してください。私は個人的に、ビジュアルエディターによって生成されるコードのファンではありません。しかし、それで私は数年(2000ish)の間ビジュアルエディターを使用していませんでした。彼らはこの時点でより良いかもしれません。

  3. JPanelsは慎重に使用してください。 UIを見て、画面サイズの変更と同じように動作するコンポーネントを決定し、JPanelでそれらのコンポーネントをグループ化します。正しいサイズ変更動作を得るために、JPanels内でJPanelsを使用することを検討してください。

私のコンポーネントでイベントを処理する方法は、通常、ジョナサンの方法とは少し異なりますが、彼の方法は私の方法より少しクリーンだと思います。

また、MVCとレイヤードアーキテクチャの使用についても十分に検討してください。 UIとビジネスロジックを混在させないことが本当に最善です。

12
hooknc