我一遍又一遍地编写相同的代码,因为当我将其编写为它自己的方法时,我遇到了范围问题,“在封闭范围中定义的局部变量......必须是最终的或有效的最终”。除了像我一直在做的那样一遍又一遍地编写代码之外,还有什么办法可以解决这个问题吗?
这有效:
monochromeOption.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
gameboard.monochromeColor = cO;
gameboard.monochromeColor_temp = cO;
gameboard.repaint();
}
});
monochromeOption.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {
gameboard.monochromeColor_temp = gameboard.monochromeColor;
gameboard.monochromeColor = cO;
gameboard.repaint();
}
@Override
public void mouseExited(MouseEvent e) {
gameboard.monochromeColor = gameboard.monochromeColor_temp;
gameboard.repaint();
}
});
这不是:
private static <T> void addRadioListenersWithMouseOver(NerdChessGameboard board, JRadioButtonMenuItem button, T toAssign, T gameboardT, T gameboardT_temp) {
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
gameboardT = toAssign;
gameboardT_temp = toAssign;
board.repaint();
}
});
button.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {
gameboardT_temp = gameboardT;
gameboardT = toAssign;
board.repaint();
}
@Override
public void mouseExited(MouseEvent e) {
gameboardT = gameboardT_temp;
board.repaint();
}
});
}
这是范围问题,需要一个变量为final或有效的final,我总是围绕它编写代码,但这一次它真的......丑陋。我已经将同一段代码复制粘贴了十几次,但我看不出有任何原因。我知道这就是 JVM 的工作方式,这样做是为了避免在其他情况下出现更大的错误。但在这种情况下这是没有意义的,我想要一个解决办法!哈哈。我是否遗漏了一些明显的东西,或者每个使用 Java 的人都只是围绕这个问题编写代码以换取使用 Java 的其他好处?
“...是否有一些明显我遗漏的东西,或者每个使用 Java 的人都只是围绕这个问题编写代码以换取使用 Java 的其他好处?”
Java 继承 主题通常会涵盖您所描述的问题。
由于您要在 button 对象中创建 anonymous-class,因此封装此资源。
组织数据的方法不止一种,这里是一个基本示例。
class Example<T> extends JRadioButtonMenuItem implements ActionListener, MouseListener {
NerdChessGameboard board;
T toAssign, gameboardT, gameboardT_temp;
@Override
public void actionPerformed(ActionEvent e) {
gameboardT = toAssign;
gameboardT_temp = toAssign;
board.repaint();
}
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {
gameboardT_temp = gameboardT;
gameboardT = toAssign;
board.repaint();
}
@Override
public void mouseExited(MouseEvent e) {
gameboardT = gameboardT_temp;
board.repaint();
}
class NerdChessGameboard extends JComponent { }
}