0

JPanels を含む 2D 配列があり、配列内のすべての JPanel に mouseListener を追加したいので、2 つの for ループを使用してそれらを追加しますが、for ループで使用した変数をすべての mouseListener に渡したいのですが、すべての mouseListener が、最後の for ループで使用された最後の変数の値が同じであることを確認します。

ここに私のコードがあります:

 for (i=0 ; i<3; i++) {
    for (k=0; k<3; k++) {
       a[i][k].addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e){
                  temp = a[i-1][k];
                  a[i-1][k] = a[i][k];
                  a[i][k] = temp;
                  //some
                  //code here 
            public void mouseClicked (MouseEvent e) {}
            public void mouseReleased(MouseEvent e) 
                {
                    invalidate();
                    revalidate();
                    repaint();
                }
            public void mouseEntered (MouseEvent e) 
                {}
            public void mouseExited  (MouseEvent e) {

                }


            });

        }
    }

mouseListeners への引数として変数 i,k を mouselisteners に渡す方法があるかどうかを知る必要があるだけです

4

2 に答える 2

1

final匿名メソッドには、ローカル変数とクラス フィールドのみを渡すことができます。

MouseAdapterコンストラクターの引数として配列と適切なインデックスを受け取る を実装する新しいクラスを作成することをお勧めします。MouseEvent次に、それらをクラスのフィールドとして保存し、 s が呼び出されたときにそれらを使用できます。

ここで言及していない追加の変数にアクセスする必要がある場合は、いつでもこの新しいクラスのコンストラクターに渡すことができます。

コード:

public AppletMouseListener extends MouseAdapter {
  private final JApplet theApplet;
  private final Container[][] a;
  private final int i;
  private final int j;

  public AppletMouseListener(JApplet theApplet, Container[][] a, int i, int k) {
    this.theApplet = theApplet;
    this.a = a;
    this.i = i;
    this.k = k;
  }

  @Override
  public void mousePressed(MouseEvent e) {
    JComponent temp = a[i-1][k];
    a[i-1][k] = a[i][k];
    a[i][k] = temp;
    //some
    //code here 
  }

  @Override
  public void mouseReleased(MouseEvent e) {
    theApplet.invalidate();
    theApplet.revalidate();
    theApplet.repaint();
  }
}
于 2013-04-25T21:10:22.373 に答える