在JMenuItems上迭代JMenu

时间:2017-04-29 18:35:17

标签: java swing jmenu jmenuitem

我试图找到按名称在JMenu中选择元素的方法。 基本上,我想要做的是:

public boolean setEnableByName(boolean enable, String itemName) {
   for (Component item :  myJMenu.getComponents()) {
      if (item.getName().equals(itemName)) {
          item.setEnabled(enable);
          return true;
      }
   }
   return false;
}

我尝试过迭代myJMenu.getComponents()myJMenu.getMenuComponents(),但无济于事。我搜索了原因,似乎是因为JMenu没有直接存储子菜单和项目,即它们并不存在。

在SO上有一个类似的问题,但它的历史可以追溯到2012年,并且swing有很多变化。

我使用包含2个JMenus和2个JMenuItems的JMenu进行了测试。 我得到的结果是:

  • 使用getComponents()时: 我永远不会进入foreach(也就是没有返回的元素)
  • 使用getMenuComponents()时:我获得了两个JMenu元素

注意:请注意,我无法使用this method,因为触发操作的元素可以在代码中的任何位置。

注意:从测试中我发现,对于我的菜单,getComponentsCount返回0,getMenuComponentsCount返回4,就像getItemsCount一样。 我的问题来自于我正在比较我的元素的name而不是text

1 个答案:

答案 0 :(得分:2)

我假设您正在寻找JMenuItems,并且您已使用add功能将其添加到JMenu。在这种情况下,您可以使用getItemCount()getItem(int pos)函数,如下所示:

public boolean setEnableByName(boolean enable, String itemName) {
   for (int i = 0 ; i <  myJMenu.getItemCount(); i++) {
      JMenuItem item = myJMenu.getItem(i);
      if (item.getName().equals(itemName)) {
          item.setEnabled(enable);
          return true;
      }
   }
   return false;
}