java - 在新的 ActionListener 中使用 int 值

标签 java

如何将 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/

相关文章:

java - 如何从 java 执行 shell 脚本,它会重启 tomcat 并继续运行

java - 无法从 Firebase 获取用户名列表

java - 跨源请求被阻止的 Spring REST 服务 + AJAX

Java:使用自定义标签为 Web 应用程序创建 GUI 构建器

java - Spring @Cacheable 仍然执行复杂的键

java - Spring Boot 微服务 - 从数据库检索数据

java - 即使使用包装类,SwingWorker 异常也会丢失

java - java for循环的效率

java - 限制迭代时删除元素

java - 为什么 Java Step Return 会遇到断点