【问题标题】:Java swing how to set icon in menu on text positionJava swing如何在文本位置的菜单中设置图标
【发布时间】:2016-10-10 00:16:58
【问题描述】:

我需要在 JMenu 中放置一个红色矩形作为分隔符。它不能只是一个分隔符实例,它必须是 JMenuItem(JSeparator 占据菜单的所有宽度)。我的问题是,当我将此矩形设置为图标时,它(正确地......)将所有菜单组件向右移动,扩大整个菜单。我希望它位于上方和下方元素的文本位置。

我正在尝试使用 html,但它什么也没画,或者只是一个小的垂直黑点。

JMenuItem sep = new JMenuItem();
    sep.setText("<html><hr size=5 style='background:red;'></html>");

【问题讨论】:

  • 是否缺少右括号 &lt;hr&gt;...&lt;hr/&gt; ?或者至少用&lt;hr .../&gt;关闭它
  • 请显示期望的行为和当前发生的情况
  • @Sanjeev - 期望的行为是:在不使用 JSeperator 的情况下创建分隔符,也就是使用自定义的 JMenuItem - 发生的事情是 html 代码没有按预期生成行......跨度>
  • @MartinFrank 我刚刚添加了一张图片来展示我使用 html 时的外观。关闭括号不会改变任何事情。
  • 尝试为
    添加css,例如

标签: java html swing


【解决方案1】:
Try to add css for <hr> like <hr style='height :5px;' /> 

您可以根据需要增加身高。

【讨论】:

    【解决方案2】:

    您可以通过扩展JMenuItem来创建自定义分隔符

    class RedSeparator extends JMenuItem {
    
        public RedSeparator() {
            setBorder(BorderFactory.createLineBorder(Color.RED));
            setPreferredSize(new Dimension(1,1));
        }
    }
    

    您可以将分隔符添加为普通的JMenuItem

    JMenu menu = new JMenu("File");
    menu.add(new JMenuItem("Save"));
    menu.add(new RedSeparator());
    menu.add(new JMenuItem("Exit"));
    

    希望这会有所帮助。

    【讨论】:

    • 使用Border 是个好主意...(我认为这是比使用&lt;hr /&gt; 更好的解决方案,因为它使用布局管理器并动态调整大小(不像在html 中那样固定)跨度>
    • 请注意,此作业中的 JMenuItems 已经凸起斜角边框,我无法更改
    • @cAmpy 您始终可以为分隔符设置新边框。它不会改变其他菜单项的边框
    • Sanjeev 这产生的结果与添加带有红色背景的 JSeparator 完全相同。
    【解决方案3】:

    您的 html 是一个小的垂直点,因为您没有提供宽度。通过提供如下所示的宽度,您将看到您的线条:

    sep.setText("<html><hr style=\"width:100px;\"></html>");
    

    尽管提供了颜色,但您的线是黑色的这一事实可能源于此错误:

    https://bugs.openjdk.java.net/browse/JDK-5059678


    您可以为组件设置样式,而不是使用 hr 标签,这将带来额外的好处,即宽度更灵活。使用上述方法,您的分隔符将始终为 100 像素,这意味着当将基于大/小文本的项目添加到菜单时,它可能看起来不合适

    这样的东西能满足你的需要吗?

    private JMenuItem createColoredSeparator(Color color){
        JMenuItem separator = new JMenuItem();
        separator.setPreferredSize(new Dimension(5,5));
        separator.setBackground(color);
        separator.setEnabled(false); //make the item unclickable so menu doesn't close
        return separator;
    }
    

    示例用法:

    JMenu menu = new JMenu("Menu");
    menu.add(new JMenuItem("VeryLongMenuItemName"));
    menu.add(createColoredSeparator(Color.RED));
    menu.add(new JMenuItem("MenuItemName"));
    

    输出:


    要使上面的内容不使用所选颜色填充整个宽度,您可以在createColoredSeparator 中添加默认颜色的边框以隐藏部分背景并进行这些编辑:

    separator.setPreferredSize(new Dimension(20,20));   
    
    separator.setBorder(BorderFactory.createLineBorder(UIManager.getColor("MenuItem.background"), 8));
    

    输出:


    更新:我不知道您需要在潜在解决方案之上应用凸起边框。您可以使用 CompoundBorder 来实现这一点,它是 How to use Borders 的一部分。这允许您将多个边框合并在一起,一次两个,一个应用于内部,另一个应用于外部。

    更新如下:

    private JMenuItem createColoredSeparator(Color color){
            JMenuItem separator = new JMenuItem();
            separator.setPreferredSize(new Dimension(50,50)); //Increased to highlight whats happening
            //Imitate the default raised border
            Border raisedBorder = BorderFactory.createBevelBorder(BevelBorder.RAISED,
                    UIManager.getColor("MenuItem.background"),UIManager.getColor("MenuItem.background").darker());
            //Merge the borders with the raised border applied outside of the border concealing part of the background
            separator.setBorder(new CompoundBorder(
                    raisedBorder, BorderFactory.createLineBorder(UIManager.getColor("MenuItem.background"), 8)));
            separator.setBackground(color);
            separator.setEnabled(false); //make the item un-clickable so menu doesn't close
            return separator;
        }
    

    提供以下内容:

    【讨论】:

    • 谢谢,我已经尝试过你的方法,但这给了我一个充满红色背景的整个jMenuItem。我需要的是 JMenuItem 内的一个矩形粗线。
    • 看起来好多了,但我仍然必须在此分隔菜单项上保留凸起的斜角边框。
    • @cAMPy 不知道您还需要凸起的斜角边框。我已经更新了我的答案以包含它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多