Java swing如何在文本位置的菜单中设置图标

标签 java html swing

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

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

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

enter image description here

最佳答案

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

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

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

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


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

这样的东西可以满足您的需要吗?

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"));

输出:

enter image description here


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

separator.setPreferredSize(new Dimension(20,20));   

separator.setBorder(BorderFactory.createLineBorder(UIManager.getColor("MenuItem.background"), 8));

输出:
enter image description here


更新:我不知道您需要在潜在解决方案之上应用凸起边框。您可以通过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;
    }

提供以下内容:

enter image description here

关于Java swing如何在文本位置的菜单中设置图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37724355/

相关文章:

java - 初始化 log4j 时的警告

java - 如何将默认的snackbar动画更改为 "Top-to-button"?

java - 在 JScrollPane 中滚动 JComponent

java - 无法正确对齐标签

java - 我应该使用哪个布局管理器来实现以下目标?

java - 将两个 TokenStream 流添加在一起(ASCIIFoldingFilter 案例)

java - 自动获取商业项目中所有依赖开源 Artifact 的许可证信息

javascript - 如何在单击 li 时显示 li 的边框

html - 检测HTML5段落结尾-与HTML序列化相关

html - icon-bar 类不显示 Button 中的行