簡體   English   中英

如何使用for循環創建N個ActionListener?

[英]How to create N ActionListener with for loop?

我用for循環創建了N個(未知大小)Jbutton,並將它們放在框架中。 我試圖通過單擊按鈕編號x來顯示消息“按鈕編號x”。 在第二個for循環上,當我嘗試創建N個ActionListener時遇到一些錯誤。

錯誤

我在封閉范圍內定義的局部變量必須是final或有效的final

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

您對此錯誤有解決方案嗎?

你可以做

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

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

如果在任何方法內部都創建了匿名類,則該方法中定義的但在匿名類主體之外的所有局部變量都應設為最終變量,以防需要在匿名類中使用它們。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM