【问题标题】:JMenu submenu little arrow icon indicatorJMenu 子菜单小箭头图标指示器
【发布时间】:2012-08-21 01:15:10
【问题描述】:

有谁知道如何控制出现在 JMenu 子菜单上的小箭头的显示?

我可以改变它吗? 我可以禁用它吗? 可以搬吗?

另外,我注意到只有当顶级 JMenu 是其他 JMenu 的子菜单时,该箭头才会出现在顶级 JMenu 上。这种不一致让我很恼火,因为我在 JMenuBar 的根目录上混合了 JMenuItem 和 JMenu,所以我希望它总是能指出这一点。无论如何也要这样做?

谢谢!

【问题讨论】:

  • 这可能取决于您使用的 L&F
  • 我正在使用 MetalLookAndFeel。您可以在特定的外观和感觉中禁用它吗?
  • “只有当它们是其他 JMenu 的子菜单时,此箭头才会出现在顶级 JMenu 上。” 嗯?你能用code表达吗?
  • 当菜单像 myJMenuBar.add(new JMenu("Top Level Menu")) 那样直接添加到 JMenuBar 时,则不会出现指示子菜单的小箭头。但是,如果您像在 myTopLevelJMenu.add(new JMenu("lower level jmenu") 中那样将 JMenu 添加到已经存在的 JMenu 中,那么箭头会出现

标签: java swing submenu jmenu jmenubar


【解决方案1】:

只有当它们是其他 JMenu 的子菜单时,此箭头才会出现在顶级 JMenu 上。

在这里使用 Metal 的外观看起来(单调地)一致。

import javax.swing.*;

public class MenuArrows {

    MenuArrows() {
        JMenuBar mb = new JMenuBar();

        JMenu root1 = new JMenu("Root Menu 1"); 
        JMenu root2 = new JMenu("Root Menu 2"); 

        addSubMenus(root1, 5);
        addSubMenus(root2, 3);

        mb.add(root1);
        mb.add(root2);

        JOptionPane.showMessageDialog(null, mb);
    }

    public void addSubMenus(JMenu parent, int number) {
        for (int i=1; i<=number; i++) {
            JMenu menu = new JMenu("Sub Menu " + i);
            parent.add(menu);

            addSubMenus(menu, number-1);
            addMenuItems(menu, number);
        }
    }

    public void addMenuItems(JMenu parent, int number) {
        for(int i=1; i<=number; i++) {
            parent.add(new JMenuItem("Item " + i));
        }
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                new MenuArrows();
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

【讨论】:

  • @trashgod 保存了一些打字或复制/粘贴。 ;)
  • 我想知道add*()方法是否应该是private;它们是从构造函数中调用的,addSubMenus() 有点危险。传入Short.MAX_VALUE(最终)会打印出该站点的名称。 :-)
  • @trashgod 必须承认,我想更多的是“展示发布 SSCCE 的优势”,而不是良好的编码技术或回答..问题是什么?
【解决方案2】:

看看Menu.arrowIcon UI 属性

(感谢 AndrewThompson 提供测试代码)。

这样做会影响应用修改后创建的所有菜单。

所以在你初始化 Look and Feel 之后,在你创建任何菜单之前调用UIManager.getLookAndFeelDefaults().put("Menu.arrowIcon", null);

我只想说,我认为这是一个糟糕的想法,并且会极力阻止您这样做。

【讨论】:

  • +1 即使你是buried the lead。 :-)
  • 这很有帮助,因为没有办法将它添加到顶级菜单中,所以我将它完全删除
猜你喜欢
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
相关资源
最近更新 更多