如何用for循环创建N个ActionListener?
How to create N ActionListener with for loop?
我用 for 循环创建了 N(unknown SIZE) 个 Jbuttons 并将它们放在框架中。
我试图通过单击按钮编号 x 来显示消息 "Button number x"。
在第二个 for 循环中,当我尝试创建 N ActionListener 时出现一些错误。
错误
Local variable I defined in an enclosing scope must be final or effectively 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();
}
}
您有解决错误的方法吗?
您不能在 ActionListener
实现中引用局部变量 i
,除非 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)
);
}
你可以
JOptionPane.showMessageDialog(null, "Button number " + e.getActionCommand());
如果匿名 class 是在任何方法中创建的,那么在方法中定义但在匿名 class 主体之外的所有局部变量都应该是最终的,以防需要使用它们匿名 class.
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();
}
}
我用 for 循环创建了 N(unknown SIZE) 个 Jbuttons 并将它们放在框架中。 我试图通过单击按钮编号 x 来显示消息 "Button number x"。 在第二个 for 循环中,当我尝试创建 N ActionListener 时出现一些错误。
错误
Local variable I defined in an enclosing scope must be final or effectively 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();
}
}
您有解决错误的方法吗?
您不能在 ActionListener
实现中引用局部变量 i
,除非 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)
);
}
你可以
JOptionPane.showMessageDialog(null, "Button number " + e.getActionCommand());
如果匿名 class 是在任何方法中创建的,那么在方法中定义但在匿名 class 主体之外的所有局部变量都应该是最终的,以防需要使用它们匿名 class.
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();
}
}