缩短一段代码会出错;我该如何解决这个问题?
Shortening a piece of code gives an error; How do I solve this issue?
我在一个方法中有这段代码:
switches[0].addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e)
{
if(switchstate[0] == false)
{
if((e.getX() >= OFFBUTTONLEFT && e.getX() <= OFFBUTTONRIGHT) && (e.getY() >= OFFBUTTONTOP && e.getY() <= OFFBUTTONDOWN))
switchstate[0] = true;
}else
{
if((e.getX() >= ONBUTTONLEFT && e.getX() <= ONBUTTONRIGHT) && (e.getY() >= ONBUTTONTOP && e.getY() <= ONBUTTONDOWN))
switchstate[0] = false;
}
paintStuff();
}
});
switches[1].addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e)
{
if(switchstate[1] == false)
{
if((e.getX() >= OFFBUTTONLEFT && e.getX() <= OFFBUTTONRIGHT) && (e.getY() >= OFFBUTTONTOP && e.getY() <= OFFBUTTONDOWN))
switchstate[1] = true;
}else
{
if((e.getX() >= ONBUTTONLEFT && e.getX() <= ONBUTTONRIGHT) && (e.getY() >= ONBUTTONTOP && e.getY() <= ONBUTTONDOWN))
switchstate[1] = false;
}
paintStuff();
}
});
switches[2].addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e)
{
if(switchstate[2] == false)
{
if((e.getX() >= OFFBUTTONLEFT && e.getX() <= OFFBUTTONRIGHT) && (e.getY() >= OFFBUTTONTOP && e.getY() <= OFFBUTTONDOWN))
switchstate[2] = true;
}else
{
if((e.getX() >= ONBUTTONLEFT && e.getX() <= ONBUTTONRIGHT) && (e.getY() >= ONBUTTONTOP && e.getY() <= ONBUTTONDOWN))
switchstate[2] = false;
}
paintStuff();
}
});
其中变量(class 的字段)是
JLabel[] switches = new JLabel[3]; //I've initialized each index
boolean[] switchstate = new boolean[3]; //Indices Initialized to 'false'
和
final static int OFFBUTTONTOP = 75;
final static int OFFBUTTONLEFT = 30;
final static int OFFBUTTONRIGHT = 65;
final static int OFFBUTTONDOWN = 115;
final static int ONBUTTONTOP = 35;
final static int ONBUTTONLEFT = 25;
final static int ONBUTTONRIGHT = 60;
final static int ONBUTTONDOWN = 75;
我想缩短那段代码,所以我做到了
for(final int i=0; i<switchstate.length; i++)
switches[i].addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e)
{
if(switchstate[i])
{
if(ON_RECTANGLE.contains(e.getX(), e.getY()))
switchstate[i] = false;
}
else
{
if(OFF_RECTANGLE.contains(e.getX(), e.getY()))
switchstate[i] = true;
}
}
});
两个新变量是
final static Rectangle OFF_RECTANGLE = new Rectangle(30, 75, 35, 40);
final static Rectangle ON_RECTANGLE = new Rectangle(25, 35, 35, 30);
但是缩短的代码给我一个错误:
error: local variable i is accessed from within inner class; needs to be declared final
但是如果我将 i
声明为 final
,我将无法使用 i++
,因为它给出了
error: cannot assign a value to final variable i
如何避免这个问题?
使用另一个变量-
for(int i = 0; i < switchstate.length; i++) {
final int j = i;
switches[i].addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e)
{
if(switchstate[j])
{
if(ON_RECTANGLE.contains(e.getX(), e.getY()))
switchstate[j] = false;
}
else
{
if(OFF_RECTANGLE.contains(e.getX(), e.getY()))
switchstate[j] = true;
}
paintStuff();
}
});
}
通过这种方式,您可以在 mouseClicked 方法中 捕获 i
的值,而不是捕获变量本身(不幸的是 Java 不会还允许)。
我在一个方法中有这段代码:
switches[0].addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e)
{
if(switchstate[0] == false)
{
if((e.getX() >= OFFBUTTONLEFT && e.getX() <= OFFBUTTONRIGHT) && (e.getY() >= OFFBUTTONTOP && e.getY() <= OFFBUTTONDOWN))
switchstate[0] = true;
}else
{
if((e.getX() >= ONBUTTONLEFT && e.getX() <= ONBUTTONRIGHT) && (e.getY() >= ONBUTTONTOP && e.getY() <= ONBUTTONDOWN))
switchstate[0] = false;
}
paintStuff();
}
});
switches[1].addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e)
{
if(switchstate[1] == false)
{
if((e.getX() >= OFFBUTTONLEFT && e.getX() <= OFFBUTTONRIGHT) && (e.getY() >= OFFBUTTONTOP && e.getY() <= OFFBUTTONDOWN))
switchstate[1] = true;
}else
{
if((e.getX() >= ONBUTTONLEFT && e.getX() <= ONBUTTONRIGHT) && (e.getY() >= ONBUTTONTOP && e.getY() <= ONBUTTONDOWN))
switchstate[1] = false;
}
paintStuff();
}
});
switches[2].addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e)
{
if(switchstate[2] == false)
{
if((e.getX() >= OFFBUTTONLEFT && e.getX() <= OFFBUTTONRIGHT) && (e.getY() >= OFFBUTTONTOP && e.getY() <= OFFBUTTONDOWN))
switchstate[2] = true;
}else
{
if((e.getX() >= ONBUTTONLEFT && e.getX() <= ONBUTTONRIGHT) && (e.getY() >= ONBUTTONTOP && e.getY() <= ONBUTTONDOWN))
switchstate[2] = false;
}
paintStuff();
}
});
其中变量(class 的字段)是
JLabel[] switches = new JLabel[3]; //I've initialized each index
boolean[] switchstate = new boolean[3]; //Indices Initialized to 'false'
和
final static int OFFBUTTONTOP = 75;
final static int OFFBUTTONLEFT = 30;
final static int OFFBUTTONRIGHT = 65;
final static int OFFBUTTONDOWN = 115;
final static int ONBUTTONTOP = 35;
final static int ONBUTTONLEFT = 25;
final static int ONBUTTONRIGHT = 60;
final static int ONBUTTONDOWN = 75;
我想缩短那段代码,所以我做到了
for(final int i=0; i<switchstate.length; i++)
switches[i].addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e)
{
if(switchstate[i])
{
if(ON_RECTANGLE.contains(e.getX(), e.getY()))
switchstate[i] = false;
}
else
{
if(OFF_RECTANGLE.contains(e.getX(), e.getY()))
switchstate[i] = true;
}
}
});
两个新变量是
final static Rectangle OFF_RECTANGLE = new Rectangle(30, 75, 35, 40);
final static Rectangle ON_RECTANGLE = new Rectangle(25, 35, 35, 30);
但是缩短的代码给我一个错误:
error: local variable i is accessed from within inner class; needs to be declared final
但是如果我将 i
声明为 final
,我将无法使用 i++
,因为它给出了
error: cannot assign a value to final variable i
如何避免这个问题?
使用另一个变量-
for(int i = 0; i < switchstate.length; i++) {
final int j = i;
switches[i].addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e)
{
if(switchstate[j])
{
if(ON_RECTANGLE.contains(e.getX(), e.getY()))
switchstate[j] = false;
}
else
{
if(OFF_RECTANGLE.contains(e.getX(), e.getY()))
switchstate[j] = true;
}
paintStuff();
}
});
}
通过这种方式,您可以在 mouseClicked 方法中 捕获 i
的值,而不是捕获变量本身(不幸的是 Java 不会还允许)。