您的 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;
}
提供以下内容: