I'm writing the same code over and over, because when I write it as it's own method I get the scope issue, "Local variable ... defined in an enclosing scope must be final or effectively final". Is there any way around this, other than just writing the code over and over as I have been doing?
This works:
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();
}
});
This doesn't:
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();
}
});
}
It's the scope issue, requiring a variable to final or effectively final, and I always just code around it, but this time it's really... ugly. I've copy-pasted the same piece of code a dozen times now, and I just don't see any reason for this. I get that it's just the way the JVM works, that it's doing this to avoid bigger errors in other situations. But in this situation it makes no sense and I want a way around it! Lol. Is there something obvious that I'm missing, or does everyone that uses Java just code around this issue in exchange for use of the other benefits of Java?
"... Is there something obvious that I'm missing, or does everyone that uses Java just code around this issue in exchange for use of the other benefits of Java?"
The topic of Java inheritance will typically cover the issue you're describing.
Since you're creating an anonymous-class within your button object, encapsulate this resource.
There is more than one way to organize the data, here is a basic example.
class NerdChessGameboard extends JComponent {
class Example<T> extends JRadioButtonMenuItem implements ActionListener, MouseListener {
T toAssign, gameboardT, gameboardT_temp;
@Override
public void actionPerformed(ActionEvent e) {
gameboardT = toAssign;
gameboardT_temp = toAssign;
NerdChessGameboard.this.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;
NerdChessGameboard.this.repaint();
}
@Override
public void mouseExited(MouseEvent e) {
gameboardT = gameboardT_temp;
NerdChessGameboard.this.repaint();
}
}
}