2

グラフを表示したり、グラフを操作したりするユーザーインターフェイスを作成しています。クラスはJFrameを拡張し、ActionListenerを実装します。次に、ActionListenerはさまざまなクラスを呼び出して、アクションに応じてグラフを操作します。これは、クラスにActionListenerがほとんどないときに機能しました。しかし、今ではクラスは管理不能になりつつあります。

カプセル化のために、ユーザーインターフェイスクラス内にActionListenerを含めるのが最適であることを私は知っています。これは、インターフェイスの非静的コンポーネントにアクセスする必要があるためです。ただし、カプセル化と読みやすさの間に矛盾があるようです。

私が提案しているのは、クラスをインターフェイス用に1つのクラスに分割し、ActionListener用に2つに分割して、インターフェイスコンポーネントに静的にアクセスすることです。私が知りたいのは、これは基本的な設計規則に従っているのかということです。そして、これが許容できるアプローチである場合、メインクラスをユーザーインターフェイスクラスまたはActionListenerクラスに配置しますか?

4

1 に答える 1

6

重複した質問ではありません...しかし、私の答えはあなたの質問に役立つはずです。

短い夏のように、私の好みは、JFrameクラスにActionListenerを実装せず、次にActionListenerを実装するJFrameを持つ名前付き内部クラスをいくつか持つことです。

私はメインをそれ自体のクラスに配置します...そしてそれをメインと呼びます。

これが私がそれをするのが好きな方法のためのいくつかのサンプルコードです:

import javax.swing.JFrame;
import javax.swing.SwingUtilities;


public class Main
{
    private Main()
    {
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        final FooFrame frame;

        frame = new FooFrame();
        frame.setupGUI();
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

次にGUI:

import java.awt.FlowLayout;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;


public class FooFrame
    extends JFrame
{
    private final JButton incrementBtn;
    private final JButton decrementBtn;
    private int value;

    {
        incrementBtn = new JButton("++");
        decrementBtn = new JButton("--");
    }

    private class IncrementListener
        implements ActionListener
    {

        public void actionPerformed(final ActionEvent evt)
        {
            increment();
        }

    }

    private class DecrementListener
        implements ActionListener
    {

        public void actionPerformed(final ActionEvent evt)
        {
            decrement();
        }

    }

    public void setupGUI()
    {
        final LayoutManager layout;

        layout = new FlowLayout();
        setLayout(layout);
        setupListeners();
        addComponents();
    }

    private void setupListeners()
    {
        incrementBtn.addActionListener(new IncrementListener());
        decrementBtn.addActionListener(new DecrementListener());
    }

    private void addComponents()
    {
        add(incrementBtn);
        add(decrementBtn);
    }

    private void increment()
    {
        value++;
        System.out.println("value = " + value);
    }

    private void decrement()
    {
        value--;
        System.out.println("value = " + value);
    }
}
于 2009-12-07T03:53:07.137 に答える