我正在制作一个刽子手游戏。我使用Netbeans中的GUI工具栏创建了一个按钮A - Z,如下所示:
我的问题是,我怎样才能为所有这些添加一个actionlistener。是否可以使用循环?如果我单击按钮A,我将得到字符'a',依此类推..
答案 0 :(得分:5)
是的,可以使用循环,但由于您的JButton是使用NetBeans代码生成创建的,因此它们最初不会在数组或集合中,因此您必须这样做:创建一个JButton数组,并用NetBeans创建的按钮填充它。然后创建一个for循环并在该循环中添加一个ActionListener,在其逻辑中使用ActionEvent的actionCommand(如上所述),这是一件微不足道的事。
话虽如此,我认为更好的解决方案是放弃使用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);
}
}
答案 1 :(得分:3)
嗯,有了一些伪代码,这对你有意义吗?
for(button in bord) {
button.addActionListener(my_actionlistener);
}
然后在你的actionlistener中你可以看到按下了哪个按钮
public void actionPerformed(ActionEvent e) {
// button pressed
if ("string".equals(e.getActionCommand()) {
// do something
}
// and so forth
}
答案 2 :(得分:3)
您需要将按钮添加到某种列表中,以便您可以遍历它们,Netbeans在您生成按钮时不会为您执行此操作。
之后,只需为包含所有按钮的列表中的每个循环运行一个。要获取字符的值,只需转换relevant ascii value,对于小写字母a,从97开始,对于大写字母A,则从65开始:
int charNum = 97;
for(Button b : board) {
char charVal = (char)charNum;
charNum++;
//add the action listener
}