4

我正在创建一个刽子手游戏。我使用 Netbeans 中的 GUI 工具栏制作了一个按钮 A - Z,如下所示:。在此处输入图像描述

我的问题是,我怎样才能为所有这些添加一个动作监听器。是否可以使用循环?如果我单击按钮 A,我将得到字符“a”,依此类推..

4

3 回答 3

5

是的,可以使用循环,但是由于您的 JButton 是使用 NetBeans 代码生成创建的,它们最初不会在数组或集合中,因此您必须这样做:创建数组JButton 并用 NetBeans 创建的按钮填充它。然后创建一个 for 循环并在该循环中添加一个在其逻辑中使用 ActionEvent 的 actionCommand(如上所述)的 ActionListener 是一件小事。

话虽如此,我认为更好的解决方案是放弃使用 NetBean 的 GUI 构建器 (Matisse),而是手动创建 Swing 代码。这将使您更好地控制您的代码并更好地理解它。例如,如果您这样做,那么在您的 for 循环中,您可以创建按钮、添加侦听器并将按钮添加到其容器 (JPanel)。

例如,

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;

public class Foo2 {
    public static void main(String[] args) {
        JPanel buttonContainer = new JPanel(new GridLayout(3, 9, 10, 10));
        List<JButton> letterButtons = new ArrayList<JButton>(); // *** may not even be necessary
        for (char buttonChar = 'A'; buttonChar <= 'Z'; buttonChar++) {
            String buttonText = String.valueOf(buttonChar);
            JButton letterButton = new JButton(buttonText);
            letterButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    String actionCommand = e.getActionCommand();
                    System.out.println("actionCommand is: " + actionCommand);
                    // TODO fill in with your code
                }
            });

            buttonContainer.add(letterButton);
            letterButtons.add(letterButton);
        }

        JOptionPane.showMessageDialog(null, buttonContainer);
    }
}
于 2011-01-29T13:15:03.010 回答
3

好吧,使用一些伪代码,这对您来说没有意义吗?

for(button in bord) {
    button.addActionListener(my_actionlistener);
}

然后在您的动作监听器中,您可以看到按下了哪个按钮

public void actionPerformed(ActionEvent e) {
    // button pressed
    if ("string".equals(e.getActionCommand()) {
         // do something 
    }
    // and so forth
}
于 2011-01-29T13:04:16.100 回答
3

您需要将按钮添加到某种列表中,以便您可以遍历它们,当您生成按钮时,Netbeans 不会为您执行此操作。

之后,只需在包含所有按钮的列表上运行一个 for each 循环。要获取字符的值,只需转换相关的 ascii 值,对于小写 a,它从 97 开始,对于大写 A,它从 65 开始:

int charNum = 97;
for(Button b : board) {
    char charVal = (char)charNum;
    charNum++;
    //add the action listener
}
于 2011-01-29T13:22:27.663 回答