我正在为我的Hangman游戏(SEE PICTURE HERE)制作类似键盘的按钮,我的问题是关于内部类。我已经阅读了关于内部类的LINK,并且它说您只能使用FINAL
类型访问外部变量。但是如果我这样声明变量,我就不能再改变它的值......所以我的问题是我需要改变内部类中的值。我的代码如下:
public class MainGame extends JDialog {
private String player;
private char [] wordChar;
private JButton[] buttons;
private int level;
private int score;
private int livesLeft;
private int missedGuess;
void newGame() {
level = 0;
score = 0;
livesLeft = 10;
missedGuess = 0;
//label1:
// while (livesLeft!= 0) {
//get random WORD from LIST
Word hiddenWord = new Word();
//put random word in Array
wordChar = new char[hiddenWord.getHiddenWord().length()];
wordChar = hiddenWord.getHiddenWord().toCharArray();
buttons = new JButton[wordChar.length];
for (int i = 0; i < wordChar.length; i++){
JButton guessWord = new JButton(" ");
guessWord.setFont(new Font("Microsoft Sans Serif", 1, 18));
guessWord.setEnabled(false);
jPanel3.setLayout(new GridLayout(1, wordChar.length));
jPanel3.add(guessWord);
buttons[i] = guessWord;
}
checkLetter();
}
void checkLetter() {
int checker = 0;
while(checker != wordChar.length){
jPanel1.setLayout(new GridLayout(3, 9, 3, 5));
for (char buttonChar = 'a'; buttonChar <= 'z'; buttonChar++) {
String buttonText = String.valueOf(buttonChar);
final JButton letterButton = new JButton(buttonText);
letterButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String actionCommand = e.getActionCommand();
for (int j = 0; j < wordChar.length; j++){
String text = String.valueOf(wordChar[j]);
if(actionCommand.equals(text)){
buttons[j].setText(text);
checker++; //THIS CODE IS NOT POSSIBLE!!!!
}
}
}
});
jPanel1.add(letterButton);
}
checker++;
}
}
注意:上面的代码不完整。 int检查器用于计算已经猜到的正确字母数,这样如果它等于单词的长度,我现在可以进入下一级
如何重新制作代码?
答案 0 :(得分:3)
您可以将checker
声明为外部类的字段,并使用某种方法访问它,例如increaseChecker()
。
更新:像这样:
1)在外部类中创建检查器字段:
public class OuterClassName {
private int checker;
protected void increaseChecker() {
checker++;
}
void checkLetter() {
// ...
}
}
2)使用increaseChecker()
方法调用代替checker++
答案 1 :(得分:3)
您无法访问匿名内部类中的局部变量,这是有充分理由的。不保证在checkLetter()函数内调用actionPerformed()方法。稍后将调用它,可能(并且很可能)在函数退出之后调用,因此它的局部变量将在那时被销毁。因此,新创建的匿名类隐式获取该变量的副本。但是增加副本没有任何意义,这就是为什么只能从匿名类的方法访问最终的局部变量。
最简单的解决方法是让checker
成为外部类的字段。但是,如果仅在checkLetter()函数中访问它,那将毫无意义,除非它必须在checkLetter()调用之间保留其值。为了找到真正的答案,你需要考虑为什么要在actionPerformed()中增加checker
?什么时候应该发生?你想通过这样做实现什么目标?
答案 2 :(得分:1)
为什么不保留匿名内部类,但让它调用类的方法。这样决赛不是问题。
letterButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
letterButtonActionPerformed(e); // create this method
}
});
//.....
// new method
private void letterButtonActionPerformed(ActionEvent e) {
String actionCommand = e.getActionCommand();
for (int j = 0; j < wordChar.length; j++){
String text = String.valueOf(wordChar[j]);
if(actionCommand.equals(text)){
buttons[j].setText(text);
checker++; //THIS CODE IS NOT POSSIBLE!!!!
}
}
}