如何从使用循环创建的按钮获取输入?

时间:2014-03-24 13:01:04

标签: java swing jbutton actionlistener

我正在尝试使用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;
}

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

感谢。

4 个答案:

答案 0 :(得分:5)

在你的听众中,拨打event.getSource(),这将返回已按下的按钮。获取按钮的文本,你就有了它的编号。

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

答案 1 :(得分:1)

您可以通过在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
}

答案 2 :(得分:0)

方法#1:浏览父JPanel的子组件(非常繁琐,每次修改JPanel的内容时都必须重建)。通过使用JButtons条款确保他们if . . instanceof

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

的密钥

HashMap<String, JComponent> buttonList = new HashMap<String, JComponent>();

for(. .) {
    buttonList.put("nameForEachButton", button);
}

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

答案 3 :(得分:0)

使用数组声明您的按钮。

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
}