Java 将mouseListener添加到JPanel数组中

Java 将mouseListener添加到JPanel数组中,java,swing,jpanel,mouselistener,Java,Swing,Jpanel,Mouselistener,我有一个带有JPanel的2D数组,我想在数组中的每个JPanel中添加一个mouseListener,所以我使用2 for循环来添加它们,但是我想在每个mouseListener中传递我在for循环中使用的变量,但是当我尝试这样做时,所有mouseListener都具有在last for循环中使用的最后一个变量的相同值。那么我做错了什么 这是我的密码: for (i=0 ; i<3; i++) { for (k=0; k<3; k++) { a[i][k].

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

                }


            });

        }
    }

for(i=0;i只能将
final
局部变量和类字段传递到匿名方法中

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

如果您需要访问这里没有提到的其他变量,您可以随时将它们传递到这个新类的构造函数中

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

匿名类不能有构造函数,但它们可以访问声明的局部变量
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) {}
        });
    }
}

for(int ii=0;iia[i-1][k]=a[i][k];循环从i=0开始???将变量存储到临时变量中…可能会起作用。在数组中保存某些内容[-1]从来都不是一个好主意。。good catch@asieranbari。。也检查数组边界。是的,但这是一些示例代码,我现在有一个更大的问题。是否可以使用构造函数将变量保存在mouseListener中?如果您将侦听器设置为类,您将使用该类的构造函数创建该侦听器的对象。您可以然后将此对象传递给addMouseListener。如果我创建了一个实现MouseAdapter的新类,该类是否有办法访问JApplet,它有我作为参数放入实现MouseAdapter的类的变量?我问你,因为当我尝试这样做时,它会给出一个错误,即无法从我是一个静态上下文将
JApplet
本身传递到构造函数中,或将applet作为参数传递给ActionListener我确信这是可行的,但天哪,这很混乱,@durron597我将把命名类的建议移到顶部,但我仍然认为展示如何使用匿名类来实现这一点很重要。
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) {}
        });
    }
}