[英]add mouseListener to an array of JPanels
我有一个带有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的参数
您只能将final
局部变量和类字段传递给匿名方法。
我建议创建一个实现MouseAdapter
的新类, 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();
}
}
如果使用普通(命名)类而不是匿名类,则代码将更清晰。 然后你可以将相关的东西( 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) {}
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.