![](/img/trans.png)
[英]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.