0

我有一个 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

4 回答 4

3

您需要使用 aMap<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...
此外,您需要在完成后从地图中删除它,否则您会要求内存泄漏...

于 2013-02-17T18:30:26.327 回答
2

我建议你使用Map< String, JButton >.

在创建时,您将新按钮放入其中buttons.put( name, btn )

在您使用的事件处理程序中JButton btn = buttons.get( name )

于 2013-02-17T18:29:27.487 回答
2

是的,您需要保留对按钮的引用。数组是一种选择,但由于数组使用起来很尴尬,你应该更喜欢 List。

如果您有对包含按钮的 JPanel 的引用,则可以从中获取它们。但这可能相当麻烦。

于 2013-02-17T18:30:29.747 回答
2

我建议在地图中保留按钮列表或对它们的引用,但是您可以这样做:

for (Component i : parent.getComponents()) {
    if (i.getName().equals(btnName)) {
         JButton b = (JButton) i;
         // do stuff..
    }
}

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

于 2013-02-17T18:31:43.410 回答