【问题标题】:Java Hangman Project: Action ListenerJava Hangman 项目:动作监听器
【发布时间】:2011-01-29 12:50:38
【问题描述】:

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

我的问题是,我怎样才能为所有这些添加一个动作监听器。是否可以使用循环?如果我点击按钮 A,我会得到字符 'a' 等等..

【问题讨论】:

    标签: java swing code-generation actionlistener


    【解决方案1】:

    是的,可以使用循环,但由于您的 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);
        }
    }
    

    【讨论】:

    • +1,但由于所有按钮的操作都相同,因此您只需要创建一个 ActionListener。监听器应该在循环外创建,然后添加到循环内的按钮中。
    【解决方案2】:

    好吧,有了一些伪代码,这对你来说没有意义吗?

    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 不会在您生成按钮时为您执行此操作。

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

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

      【讨论】:

      • 在使用时最好避免使用幻数。当 Java 可以为您解决这个问题时,为什么还要担心 ascii 值是什么。作为示例,我在上面的帖子中添加了代码。
      • 这是真的(尽管我看不到您的帖子中添加了任何代码?)我的逻辑是,由于这是一个家庭作业问题,因此通过这种方式可以更清楚地看到下面发生了什么价值观之类的,而不仅仅是看起来像魔术。
      • 啊,有东西在缓存,现在就在那里!
      猜你喜欢
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-17
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多