我需要在 JMenu 中放置一个红色矩形作为分隔符。它不能只是一个分隔符实例,它必须是 JMenuItem(JSeparator 占据菜单的所有宽度)。我的问题是,当我将此矩形设置为图标时,它(正确地...)将所有菜单组件移动到右侧,从而扩大整个菜单。我希望它位于上方和下方元素的文本位置。
我正在尝试使用 html,但它什么也没有绘制,或者只是一个小的垂直黑点。
JMenuItem sep = new JMenuItem();
sep.setText("<html><hr size=5 style='background:red;'></html>");
最佳答案
您的 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"));
要使上面的内容不填充所选颜色的整个宽度,您可以添加默认颜色的边框以隐藏背景的一部分,并在 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;
}
提供以下内容:
关于Java swing如何在文本位置的菜单中设置图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37724355/