我正在尝试使用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;
}
我的问题是如何引用事件处理程序中的每个特定按钮?我无法想到一种方法,无需手动创建每个按钮而不是使用循环。
感谢。
答案 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
}