【问题标题】:How do I get input from buttons I created using a loop?如何从使用循环创建的按钮中获取输入?
【发布时间】:2014-03-24 13:01:04
【问题描述】:

我正在尝试使用 Swing 在 Java 中制作一个简单的计算器,并且我已经通过以下方式创建了我的按钮:

//Our number keypad
public static JPanel numbers(){

    //our panel to return
    JPanel panel = new JPanel();

    //Create and add 3x4 grid layout to panel
    GridLayout gl = new GridLayout(3, 4);
    panel.setLayout(gl);

    //For creating and adding buttons to panel
    for(int i = 0; i < 10; i++){

        //Create a new button where the name is the value of i
        String name = "" + i + "";
        JButton button = new JButton(name);

        //add action listener
        button.addActionListener(handler);

        //Add button to panel
        panel.add(button);
    }

    return panel;
}

我的问题是如何引用事件处理程序中的每个特定按钮?我想不出一种方法来做到这一点,而不必手动创建每个按钮而不是使用循环。

谢谢。

【问题讨论】:

    标签: java swing jbutton actionlistener


    【解决方案1】:

    在您的监听器中,调用event.getSource(),这将返回已按下的按钮。获取按钮的文本,您就有了它的编号。

    或者为每个按钮创建一个不同的处理程序实例,并将按钮的值 (i) 传递给处理程序的构造函数。最后一个解决方案更简洁,IMO,因为它不依赖于按钮的文本。例如,如果您将文本替换为图像,第一种技术将不再适用。

    【讨论】:

      【解决方案2】:

      您可以通过在handler 中添加以下内容来区分创建的按钮:

      String buttonText = ((JButton) e.getSource()).getText();
      if (<text1>.equals(buttonText)){
          //do the stuff
      } else if (<text2>.equals(buttonText)){
          //do the stuff
      } else {
          //do the stuff
      }
      

      【讨论】:

        【解决方案3】:

        方法#1:遍历父JPanel的子组件(相当繁琐,每次修改JPanel的内容时都必须重新构建)。使用if . . instanceof 子句确保它们是JButtons

        方法#2:当您在该循环中创建它们时,将它们添加到List(或者更好的是Map)。我个人更喜欢 Map,因为它可以让我为特定的 JComponent 自定义密钥

        HashMap<String, JComponent> buttonList = new HashMap<String, JComponent>();
        
        for(. .) {
            buttonList.put("nameForEachButton", button);
        }
        

        我建议根据循环计数器生成按钮名称。使用您现有的name 值,或者将其设置为"button" + i

        【讨论】:

          【解决方案4】:

          使用数组声明您的按钮。

          JButton[] button = new JButton[9]; //outside the for loop
          
          for (int i = 0; i < 10; i++) {
              //put your code
          
              button[i] = new JButton(name);
          
              //your code
          }
          

          【讨论】:

            猜你喜欢
            • 2019-09-09
            • 1970-01-01
            • 2015-04-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多