在其 JMenuItems 上迭代 JMenu

Iterate a JMenu on its JMenuItems

我正在尝试寻找通过名称在 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 进行了测试。 我得到的结果:

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

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

我假设您正在寻找 JMenuItems 并且您使用 add function. In that case you could use the getItemCount() and getItem(int pos) 函数将它们添加到您的 JMenu 中,如下所示:

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;
}