2

コンポーネントがリスナーを介して他のコンポーネントと通信できるように、swing を使用して GUI インターフェイスを開発しようとしています。私が直面した問題は次のとおりです。

メソッド


  1. リスナーの実装
  2. 匿名メソッドを使用したリスナー メソッドでリスナーを追加する
  3. リスナーを実装するクラスからのリスナーの追加

問題


  1. リスナーを実装すると、多くのオブジェクトを処理するときにオブジェクトを操作しようとすると混乱が生じます
  2. コンストラクターが無名メソッドの final を必要とすることを除いて、1 と同じです。
  3. 静的参照に頼らずにリスニング クラス外のオブジェクトを操作することはできません。

JPanel を mouseListenerClass に渡して操作を行わずに、別の JFrame クラスの一部である JPanel に MouseListenerClass を描画させるにはどうすればよいので、これは本当にイライラします。

私が機能しているように見える唯一の方法は、MouseState と呼ばれる Enum を作成することです。マウス イベント MousePressed が発生すると、静的 Enum mouseStatus が押された状態に設定され、次に JPanel paintComponent メソッドが Enum mouseStatus をチェックし、プレスがあればペイントします。

これは間違った方法のようです。

別の方法はありますか?

Cyrille のコメントを反映して更新:-

@Cyrilleに感謝します。キャストを使用してコードを修正する必要がありましたが、前提は引き続き機能します。' public void mousePressed(MouseEvent e) {

    PaintPanel p=(PaintPanel) getTargetPanel();
    p.setMousePressed(true);
    p.setMouseCoords(e.getPoint());
}


public void mouseReleased(MouseEvent e) {
    PaintPanel p=(PaintPanel) getTargetPanel();
    p.setMousePressed(false);

}

public JPanel getTargetPanel() {
    return targetPanel;
}'
4

2 に答える 2

2

マウス リスナは JPanel に描画しないでください。代わりに、MVC (Model-View-Controll) パターンを使用する必要があります。

例として、パネル、リスナー、およびデータを保持するためのクラス (モデル クラス) の 3 つのクラスをセットアップします。リスナーがトリガーされると、モデルを編集する必要があります。その後、モデルは何かが変更されたことをパネルに通知でき、パネルはモデル内のデータをチェックして適切なピクセルを描画できます。詳細については、 http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controllerを参照してください。

ところで: これは、ほとんどの標準的な Swing コンポーネントが機能する方法です。非常に単純なもの (JPanel、JTextField など) のみが MVC なしで使用でき、これらに基づいて複雑なコンポーネントを作成するには、MVC を使用する必要があります。

于 2013-07-05T14:33:39.180 に答える
1

あらゆる種類の静的変数を使用する必要はありません。ペイントを処理する JPanel のサブクラスを作成し、リスナーがそれと通信するためのメソッドをこのクラスに提供する必要があります。

public class MyPanel extends JPanel {

    // status used for drawing, can be anything you want, but let's say you need to know if the mouse is pressed.
    private boolean isMousePressed;

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        // do your stuff here, using isMousePressed
    }

    public void setMousePressed(boolean pressed) {
        isMousePressed= pressed;
    }
}

次に、マウス リスナーは MyPanel インスタンスへの参照を持ち、適切な方法を使用してそれと通信する必要があります。

public class PaintingMouseListener implements MouseListener {

    private final JPanel targetPanel;


    public PaintingMouseListener(JPanel targetPanel) {
        this.targetPanel = targetPanel;
    }


    @Override
    public void mousePressed(MouseEvent e) {
        targetPanel.setMousePressed(true);

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        targetPanel.setMousePressed(false);
    }

    // other methods of the listener
}

次に、パネルへの参照を使用してマウス リスナーを作成します。

    MyPanel targetPanel = new MyPanel();
    // assign the mouse listener to whatever component needs it.
    component.addMouseListener(new PaintingMouseListener(targetPanel));

isMousePressedこれは、モデル (変数) とビュー (MyPanel) を一緒に配置することを除いて、MVC ソリューションに似ています。このような単純なものについては、それらをまとめておく方が簡単ですが、物事が複雑になるにつれて、それらを分離し、モデルを独自のクラスに配置することをお勧めします。

于 2013-07-05T14:39:33.540 に答える