6

私はJavaプログラムを1年半開発しています。私は現在、非常に大きなグラフィカル ユーザー インターフェイスを含む夏のプロジェクトに取り組んでいます。

私の GUI は、複数のタブ付きペインで構成されています。各ペインには独自のクラスがあります。各ペインにはいくつかの jButton があります。

さて、タブ付きペインのクラスに非常に多くの匿名内部クラス (ActionListeners 用) が存在するようになったので、もっと良い方法があるに違いないと確信しています。効率のためではないにしても、保守性のために - それはかなり混乱しています。

私の質問は次のとおりです。各クラスに多くのリスナーがいる場合、リスナーを整理するのに良い方法はありますか? 次のサンプル コードのように、関連するクラスでリスナーをクラスタ化することを考えました。

public class SomeListeners implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e){
        String command = e.getActionCommand();
        switch(command){
            case "This button":
                doThis();
                break;
            case "That button":
                doThat();
                break;                          
        }
    }     
}

それとももっと良い方法があるのでしょうか?

前もって感謝します :)

4

6 に答える 6

5

次のアプローチを試すことができます。

匿名クラスの代わりに実際のクラスを使用してください。すべての ListenerClass は、ユースケース / 機能を 1 つだけ実装します。クラス名はユースケースを説明する必要があります。次に、クラスを 1 つ以上のパッケージに編成して、パッケージ内のリスナーが実装するユース ケースに適合するカテゴリ別にクラスをクラスタ化できます。

つまり、ツリー構造のように機能を整理する抽象化の階層を作成します。

ある日後、誰かがリスナーを維持しなければならない場合、最初にユースケースに適合するパッケージを探し、次にユースケース自体を探すことで、リスナーを見つけることができます。クラスよりもパッケージが少なくなるため、リスナーを見つけるのがより簡単かつ迅速になります。


別の考え方: 1 つのタブに非常に多くのイベントがあり、コード内でイベントを整理するのに問題がある場合、タブ上でイベントを視覚的に整理するにはどうすればよいでしょうか? ユーザーにとって人間工学に基づいた方法でそれを処理できますか? おそらく解決策は、機能を複数のタブに分割することでしょうか? しかし、私はあなたのUIを知らないので、それについてはあまり言えません

于 2013-08-22T17:07:58.247 に答える
4

タイプjavax.swing.AbstractActionから単一のクラスを使用することをお勧めします

例:

Action leftAction = new LeftAction(); //LeftAction code is shown later
...
button = new JButton(leftAction)
...
menuItem = new JMenuItem(leftAction);

leftAction = new LeftAction("Go left", anIcon,
         "This is the left button.",
         new Integer(KeyEvent.VK_L));

...

class LeftAction extends AbstractAction {
    public LeftAction(String text, ImageIcon icon,
                      String desc, Integer mnemonic) {
        super(text, icon);
        putValue(SHORT_DESCRIPTION, desc);
        putValue(MNEMONIC_KEY, mnemonic);
    }
    public void actionPerformed(ActionEvent e) {
        displayResult("Action for first button/menu item", e);
    }
}
于 2013-08-22T16:50:43.243 に答える
2

このコードのようなもの

public class SomeListeners implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e){
        String command = e.getActionCommand();
        switch(command){
            case "This button":
                doThis();
                break;
            case "That button":
                doThat();
                break;                          
        }
    }     
}
于 2013-08-22T21:38:52.433 に答える
1

JSR 296 は、ユーザーが行っていることや、ここで言及されている他の多くのこと (i18n、アクションなど) のフレームワークを提供することを目的としていました。最も活発な実装は、Better Swing Application Framework (BSAF) です。JSR 296 実装の使用方法に関する優れた記事は、ここにあります。

于 2013-08-22T17:44:27.080 に答える