卡是JButton,当我将它们添加到世界时,我试图为每个添加一个actionListener。这些卡是2D阵列,我将它们与for循环相加。但是我无法得到某张卡,因为当我在actionListener类中使用table [r] [c]时,我得到一个错误说"从内部类引用的局部变量必须是最终的或有效的最终"。但它是一个for循环,所以我不能让它成为最终。任何帮助将不胜感激
for(int r = 0;r<2;r++){
for(int c=0;c<5;c++){
int rNum = gen.nextInt(cards.size());
table[r][c]= new Card("deck",cards.get(rNum), 2);
cards.remove(rNum);
add(table[r][c]);
table[r][c].addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent event){
BufferedImage img2 = null;
BufferedImage img = null;
int pos = table[r][c].getName().indexOf(".");
String s = table[r][c].getName().substring(0,pos) + "S" + table[r][c].getName().substring(pos, table[r][c].getName().length());
try{
img = ImageIO.read(new File(table[r][c].getPat()+"/"+table[r][c].getName()));
}catch(IOException e){
e.printStackTrace();
}
try{
img2 = ImageIO.read(new File(table[r][c].getPat()+"/"+s));
}catch (IOException e){
e.printStackTrace();
}
if(!table[r][c].isAlive()){
ImageIcon imgFace2 = new ImageIcon(img2);
table[r][c].setIcon(imgFace2);
table[r][c].changeState();
number++;
}else{
ImageIcon imgFace = new ImageIcon(img);
table[r][c].setIcon(imgFace);
table[r][c].changeState();
number--;
}
}
}
);
答案 0 :(得分:0)
您可以将数字作为参数传递给ActionListener
。例如:
table[r][c].addActionListener(new Listener(r, c));
...
private class Listener implements ActionListener
{
private int myR, myC;
public Listener(int r, int c)
{
myR = r;
myC = c;
}
public void actionPerformed(ActionEvent event)
{
//referece myR and myC here
//e.g. table[myR][myC].changeState();
}
}
答案 1 :(得分:0)
快速解决方法是将循环变量分配给内部类可以访问的最终变量。
for(int loopR = 0;r<2;r++){
for(int loopC=0;c<5;c++){
final int r = loopR;
final int c = loopC;
// the rest of your code, using r and c
// rather than loopR and loopC
}
}
但是,使用r和c参数提取新类可能比引入新变量更容易阅读和理解。