カードはJButtonです。私はそれらをワールドに追加するときに、それぞれにactionListenerを追加しようとしています。カードは2次元配列であり、forループでそれらを追加しています。しかし、私はactionListenerクラス内でtable [r] [c]を使用すると、 "内部クラスから参照されるローカル変数は最終的にまたは効果的にfinalでなければならない"というエラーが発生するため、特定のカードを取得できません。しかし、それはforループなので、私はそれを最終的にすることはできません。どんな助けもありがたいです内部クラス内の "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--;
}
}
}
);
インラインで実装するのではなく、ActionListenerのトップレベルクラスを作成することをお勧めします。次に、必要なものをそのクラスのコンストラクタに渡すことができます。 –
しかしforループで新しい最終変数を作成することができます。 – tkausl
そして、私はJava 8でインラインクラスに非最終変数を渡すことができると信じています – RobotKarel314