2011-01-29 139 views
4

我正在创建一个hang子手游戏。我使用Netbeans中的GUI工具栏制作了一个按钮A - Z,如下所示: enter image description here爪哇Hang子手项目:行动听众

我的问题是,我如何添加一个actionlistener到它的所有。是否有可能使用循环?如果我点击按钮A,我会得到字符'a'等。

回答

5

是的,它可以使用一个循环,但是因为你的Jbutton将被使用NetBeans代码生成创建的,他们赢得了” t最初是在一个数组或集合中,因此这是您必须执行的操作:创建一个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); 
    } 
} 
+2

+1,但由于该操作是所有的按钮同样只需要创建一个ActionListener。应该在循环之外创建监听器,然后将其添加到循环中的按钮。 – camickr 2011-01-29 16:32:36

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 
} 
3

你需要的按钮添加到某种类型的列表,以便您可以遍历它们,Netbeans的不为你做这个,当你生成的按钮。

之后,只需在包含所有按钮的列表上为每个循环运行一次。要获得字符值只投了relevant ascii value,开始于97℃较低的情况下,或65为大写答:

int charNum = 97; 
for(Button b : board) { 
    char charVal = (char)charNum; 
    charNum++; 
    //add the action listener 
} 
+0

避免你使用的幻数好得多。为什么要担心Java可以为你处理这个问题时的ascii值是什么。我已经将代码添加到上面的帖子中作为示例。 – 2011-01-29 13:24:30