【问题标题】:How to create N ActionListener with for loop?如何使用 for 循环创建 N ActionListener?
【发布时间】:2018-05-08 15:12:32
【问题描述】:

我已经用 for 循环创建了 N(unknown 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();
    }
}

你有解决这个错误的办法吗?

【问题讨论】:

  • 不要使用 setBounds() 来设置按钮的大小/位置。而是使用GridLayout。让布局管理器为您完成工作。阅读 How to Use GridLayout 上的 Swing 教程部分,了解更多信息和工作示例。
  • 另外,不需要两个循环。只需在创建按钮时将 ActionListener 添加到按钮即可。

标签: java swing loops jbutton actionlistener


【解决方案1】:

你可以的

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

【讨论】:

  • (1+) 并且使用这种方法你只需要创建一个可以被所有按钮共享的 ActionListener。
【解决方案2】:

您不能在 ActionListener 实现中引用局部变量 i,除非 i 是最终的(或实际上是最终的)。但是你可以只创建一个 final 变量并引用它。

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)
    );
} 

【讨论】:

    【解决方案3】:

    如果在任何方法内创建匿名类,则在方法中但在匿名类主体之外定义的所有局部变量都应设为最终变量,以防需要在匿名类中使用。

    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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-09
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2012-12-27
      相关资源
      最近更新 更多