如何将 int 值导入到 ActionListener 中并且仍然能够更改它?并且不使用final,因为它需要编辑。
int colorSnake
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame mainFrame = new JFrame();
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setTitle("Wormy boi");
mainFrame.setResizable(true);
mainFrame.add(new Game(), BorderLayout.CENTER);
mainFrame.pack();
mainFrame.setLocationRelativeTo(null);
mainFrame.setVisible(true);
JMenu menu, options;
JMenuItem i1, i2, i3, i4, i5, i6;
JMenuBar mb=new JMenuBar();
options=new JMenu("Menu");
menu=new JMenu("Shop");
//submenu=new JMenu("Sub Menu");
i1=new JMenuItem("Red");
i1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int colorSnake =+ 1;
}
});
});
}
最佳答案
lambda 和匿名类中捕获的变量必须是有效的final
请参阅:https://stackoverflow.com/a/38471540/7759056
为了实现您的目标,您可以创建自己的 ActionListener。
class ColorSnakeActionListener extends ActionListener {
private int colorSnake;
@Override
public void actionPerformed(ActionEvent e) {
this.colorSnake += 1;
}
int getColorSnake(){
return colorSnake;
}
}
在您需要的地方跟踪此 ActionListener 的引用。
public class Foo {
private ColorSnakeActionListener actionListener = new ColorSnakeActionListener();
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame mainFrame = new JFrame();
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setTitle("Wormy boi");
mainFrame.setResizable(true);
mainFrame.add(new Game(), BorderLayout.CENTER);
mainFrame.pack();
mainFrame.setLocationRelativeTo(null);
mainFrame.setVisible(true);
JMenu menu, options;
JMenuItem i1, i2, i3, i4, i5, i6;
JMenuBar mb=new JMenuBar();
options=new JMenu("Menu");
menu=new JMenu("Shop");
//submenu=new JMenu("Sub Menu");
i1=new JMenuItem("Red");
i1.addActionListener(actionListener);
});
}
}
如果您想保持实现自由,此类也可以是私有(private)内部类。
关于java - 在新的 ActionListener 中使用 int 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60147586/