【问题标题】:Iterate a JMenu on its JMenuItems在其 JMenuItems 上迭代一个 JMenu
【发布时间】:2017-04-30 03:16:33
【问题描述】:

我正在尝试找到按名称在 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 个 JMenu 和 2 个 JMenuItem 的 JMenu 进行了测试。 我得到的结果:

  • 使用getComponents()时: 我从不进入 foreach(也就是没有返回任何元素)
  • 使用 getMenuComponents() 时:我得到了两个 JMenu 元素

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

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

【问题讨论】:

  • 您是否将JMenuItems 添加到您的JMenu 中?你能显示那个代码吗?
  • get / putClientProperty 帮你,是/可以是唯一的,可设置的,这个值(对我没有任何意义)可以在运行时改变

标签: java swing jmenu jmenuitem


【解决方案1】:

我假设您正在寻找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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 2023-03-17
    • 2022-08-17
    相关资源
    最近更新 更多