我有一个JPanel,我动态添加了很多JButton。所有这一切都很完美。稍后在我的程序执行中,我需要返回这些按钮并拉出按钮文本。我无法弄清楚如何回顾它们。
当我创建每个按钮时,我给它一个唯一的名称。假设这是我创建按钮的代码:
public void createButton(Container parent, String btnName) {
JButton btn = new JButton("xyz");
btn.setName(btnName);
btn.addActionListner(new ActionListner() {
//code
}
parent.add(btn);
}
在另一种方法中,我正在尝试检索按钮上的标签,因为它可能在运行时已更改。我是否需要在创建这些按钮时保留这些按钮的数组?或者有没有办法可以直接回复他们?
这就是我的工作,但这很愚蠢。有人能建议一个正确的方法吗?
public String getBtnLabel(String btnName) {
JButton btn = (JButton) btnName;
return btn.getText();
}
如果答案是我只需要创建数组然后迭代它,那很好。只是寻找其他选择。
答案 0 :(得分:3)
您需要使用Map<String, JButton>
,因此在创建动态按钮时,您会给它们一些不明确的名称:
//somewhere at the top of your class
private final Map<String, JButton> myButtonMap = new HashMap<>();
public void createButton(Container parent, String btnName) {
JButton btn = new JButton("xyz");
btn.setName(btnName);
btn.addActionListner(new ActionListner() {
//code
}
parent.add(btn);
myButtonMap.put(btnName, btn);
}
然后只需从地图中获取
public String getBtnLabel(String btnName) {
return myButtonMap.get(btnName).getText();
}
如果未定义按钮,这显然会抛出NPE ...
此外,当您完成它时,您需要从地图中删除,否则您要求内存泄漏...
答案 1 :(得分:2)
我建议您使用Map< String, JButton >
。
在创建时,您使用buttons.put( name, btn )
在事件处理程序中,您使用JButton btn = buttons.get( name )
答案 2 :(得分:2)
是的,您需要保留对按钮的引用。数组是一个选项,但由于数组使用起来不方便,你应该更喜欢List。
如果你有一个包含按钮的JPanel的引用,你可以从中获取它们。但这可能相当麻烦。
答案 3 :(得分:2)
我建议您在地图中保留按钮列表或对它们的引用,但是您可以这样做:
for (Component i : parent.getComponents()) {
if (i.getName().equals(btnName)) {
JButton b = (JButton) i;
// do stuff..
}
}
使用父组件并迭代添加的组件。