如何使用for循环创建N ActionListener?

时间:2018-05-08 15:12:32

标签: java swing loops jbutton actionlistener

我已经用for循环创建了N(未知SIZE)Jbuttons并将它们放在框架中。 我正在尝试显示消息"按钮编号x"点击按钮号x。 在第二个for循环中,当我尝试创建N ActionListener时,我有一些错误。

错误

  

我在封闭范围内定义的局部变量必须是最终的或有效的最终

代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class program extends JFrame{
    final int N = 10;
    final int JUMPS = 210;
    private JButton[] buttons = new JButton[N];

    public program(){
        super("test");
        setLayout(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        for (int i = 0; i < N; i++) {
            buttons[i] = new JButton("" + i);
            buttons[i].setBounds((i % 4) * JUMPS, (i / 4) *JUMPS , 200, 200);
            add(buttons[i]);
        }

        for (int i = 0; i < N; i++) {
            buttons[i].addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(null, "Button number " + i);
                }
            });
        } 

        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        program mainGUI = new program();
    }
}

您有错误的解决方案吗?

3 个答案:

答案 0 :(得分:2)

你可以做到

JOptionPane.showMessageDialog(null, "Button number " + e.getActionCommand());

答案 1 :(得分:1)

除非i是最终的(或有效最终),否则您无法在ActionListener实施中引用本地变量i。但是你可以制作一个最终变量并引用它。

for (int i = 0; i < N; i++) {
    final int final_i = i;
    buttons[i].addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            JOptionPane.showMessageDialog(null, "Button number " + final_i);
        }
    });
} 

在Java 8中,您可以更加明智地做到这一点:

for (int i = 0; i < N; i++) {
    final int final_i = i;
    buttons[i].addActionListener(e ->
       JOptionPane.showMessageDialog(null, "Button number " + final_i)
    );
} 

答案 2 :(得分:0)

如果在任何方法中创建了匿名类,那么在匿名类的主体之外但在匿名类的主体之外定义的所有局部变量都应该是最终的,以防它们需要在匿名类中使用。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class program extends JFrame{
    final int N = 10;
    final int JUMPS = 210;
    private JButton[] buttons = new JButton[N];

    public program(){
        super("test");
        setLayout(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        for (int i = 0; i < N; i++) {
            buttons[i] = new JButton("" + i);
            buttons[i].setBounds((i % 4) * JUMPS, (i / 4) *JUMPS , 200, 200);
            add(buttons[i]);
        }

        for (int i = 0; i < N; i++) {
        final int buttonNumber = i ;
            buttons[i].addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(null, "Button number " + buttonNumber);
                }
            });
        } 

        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        program mainGUI = new program();
    }
}