参考动态创建的JButton

时间:2013-02-17 18:22:55

标签: java swing

我有一个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();
}

如果答案是我只需要创建数组然后迭代它,那很好。只是寻找其他选择。

4 个答案:

答案 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..
    }
}

使用父组件并迭代添加的组件。