将mouseListener添加到JPanel数组中

时间:2013-04-25 21:08:38

标签: java swing jpanel mouselistener

我有一个带有JPanels的2D数组,我想在数组的每个JPanel中添加一个mouseListener,所以我使用2 for循环来添加它们,但我想在每个mouseListener中传递我在for循环中使用的变量但是当我试着这样做,所有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) {

                }


            });

        }
    }

我只需要知道是否有办法将变量i,k传递给mouselisteners作为mouseListener的参数

2 个答案:

答案 0 :(得分:1)

您只能将final个局部变量和类字段传递给匿名方法。

我建议创建一个实现MouseAdapter的新类,它将数组和相应的索引作为构造函数中的参数。然后,您可以将它们保存为类中的字段,并在调用MouseEvent时使用它们。

如果您需要访问此处未提及的其他变量,您可以随时将它们传递给此新类的构造函数。

代码:

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();
  }
}

答案 1 :(得分:1)

如果使用普通(命名)类而不是匿名类,则代码将更清晰。然后,您可以将相关内容(aik)传递给构造函数。

匿名类不能有构造函数,但是它们可以访问声明为final的本地变量。

for (int ii=0 ; ii<3; ii++) {
    for (int kk=0; kk<3; kk++) {
        final int i = ii;
        final int k = kk;
        a[i][k].addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e){
                JPanel temp = a[i-1][k]; // index out of bounds
                a[i-1][k] = a[i][k];
                a[i][k] = temp;
            }
            public void mouseClicked (MouseEvent e) {}
            public void mouseReleased(MouseEvent e)
            {
                invalidate();
                revalidate();
                repaint();
            }
            public void mouseEntered (MouseEvent e) {}
            public void mouseExited  (MouseEvent e) {}
        });
    }
}