[英]Local variable defined in an enclosing scope must be final or effectively final
[英]How to use array index without “Local variable x defined in an enclosing scope must be final…”
我正在编写一个简单的程序,但是有一个我无法解决的问题。
我正在使用这样的循环创建textFields:
testText = new JTextField[9][9];
for(int x = 0; x < 9; x++)
for(int y = 0; y < 9; y++)
{
testText[x][y] = new JTextField();
testText[x][y].setPreferredSize(new Dimension(30, 30));
testText[x][y].setHorizontalAlignment(SwingConstants.CENTER);
testText[x][y].setFont(new Font("Tahoma", Font.BOLD, 18));
testText[x][y].setBackground(Color.WHITE);
testText[x][y].setEditable(false);
testText[x][y].addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if( //blablabla )
testText[x][y].setText(value + "");
}
});
panelMain.add(testText[x][y]);
}
我想使用x和y来获取“单击”字段的位置,但神秘的错误说法是:“在封闭范围内定义的局部变量x必须是最终的或有效地是最终的”(与“ y”相同)
在我的项目中,将有检查功能,如果我可以将x和y用作参数,那将是一件很棒的事情:
checkIfPossibel(x,y,value); // "value" is global
请记住,我不是Java的上帝,如果可能的话,我希望将这项工作保持在(对我来说)可理解的水平上。
最好的解决方法是简化您的代码-通过引入可以为final的局部变量(从而允许您在匿名内部类中使用它)来消除所有testTest[x][y]
的重复:
testText = new JTextField[9][9];
for (int x = 0; x < 9; x++) {
for (int y = 0; y < 9; y++)
{
final JTextField field = new JTextField();
testText[x][y] = field;
field.setPreferredSize(new Dimension(30, 30));
field.setHorizontalAlignment(SwingConstants.CENTER);
field.setFont(new Font("Tahoma", Font.BOLD, 18));
field.setBackground(Color.WHITE);
field.setEditable(false);
field.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (//blablabla) {
field.setText(value + "");
}
}
});
panelMain.add(field);
}
}
目前尚不清楚您是否甚至需要testText
,但目前我假设您在其他地方引用它。
首先,您需要了解为什么编译器告诉您它无法访问非最终x
和y
。 创建new MouseAdapter()
,需要为匿名类的构造函数“捕获”变量x
和y
。 创建对象后 ,非最终x
和y
值可能会发生变化,这可能会引起混淆,因为您在mouseClicked
方法的内部和外部观察到的x
和y
的值可能不同。 这就是Java语言设计人员要求匿名方法实现中只能使用final
局部变量的原因。
现在您了解了所发生的情况,解决此问题很简单:制作x
和y
final
副本,并改用它们:
final int tmpX = x;
final int tmpY = x;
testText[x][y].addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if( //blablabla )
testText[tmpX][tmpY].setText(value + "");
}
});
创建一个临时的最终变量,如下所示:
testText[x][y].addMouseListener(new MouseAdapter() {
final int x1 = x;
final int y1 = y;
@Override
public void mouseClicked(MouseEvent e) {
if( //blablabla )
testText[x1][y1].setText(value + "");
}
});
伙计们,这是我在这里的第一篇文章,我很震惊。 您超快。 但是它不起作用,因为它支持。
为了找出答案,我做了类似的事情:
final int tmpX = x;
final int tmpY = x;
Liczba[x][y].addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
pole =javax.swing.JTextField)e.getSource());
pole.setText(tmpX + " " + tmpY);
}
});
并设置行数,例如:对于0,其“ 0 0”,对于6,“ 6 6”,依此类推。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.