问题描述
TL; DR
有没有办法摆脱MenuItem边框和定义的文本之间的图标空白?创建菜单项后,即使没有设置图标,也没有设置图标,它都会出现。
长版
我们公司开发的Java应用程序自90年代就存在。在2000年代,它经过了重新设计,并曾经具有那些可怕的eehrm之一,我的意思是幻想和色彩艳丽的“ Synthetica”主题。所以现在该变得更加严肃和可信的时候了,有了一个更加优雅和现代的L&F。这就是为什么我从SyntheticaLookAndFeel
切换到内置SystemLookAndFeel
的原因。
好吧,这不像我以前想象的那么容易,但是无论如何……我走在正确的道路上;)
我唯一想努力工作的是MenuItems
。通常,在Java中,如果您创建一个简单的Menu或PopMenu并添加一个JMenuItem,则它看起来应该像一个普通菜单,里面只有一个文本。在我们的应用程序中,我可以做任何我想做的事,它总是在每个菜单项的左侧显示一个空格。
我在整个工作区中搜索了任何(错误的)预设配置。我检查了UIManager,并尝试了将菜单项图标设置为空的其他方法,但没有发现任何有用的方法。我什至创建了一个新类EmptyIcon
,该类将一个宽度为1px的图标设置为UIManager的预设。
// The empty icon class
public class EmptyIcon implements Icon {
private int width = 1,height = 0;
@Override
public void paintIcon(Component c,Graphics g,int x,int y) {}
@Override
public int getIconWidth() {
return width;
}
@Override
public int getIconHeight() {
return height;
}
}
// set this config in the gui configuration file
UIManager.put("MenuItem.arrowIcon",new EmptyIcon());
UIManager.put("MenuItem.checkIcon",new EmptyIcon());
到目前为止没有任何帮助。 有人知道这种行为可能来自哪里吗?我应该到哪里去寻找这种配置错误?
有什么方法可以迫使ui摆脱这些图标?
要获得更好的主意,您可以在下面找到一些图片。 这是主菜单栏:
这是我尝试使用的代码,以消除差距:
jMenuItem1.setIcon(null);
jMenuItem1.setHorizontalAlignment(JMenuItem.LEFT);
jMenuItem1.setHorizontalTextPosition(JMenuItem.LEFT);
jMenuItem1.setIconTextGap(0);
jMenuItem1.setMargin(new Insets(0,0));
jMenuItem1.setpressedIcon(null);
jMenuItem1.setText("TEST TEST TEST");
解决方法
我试图复制它,但事实证明,当它更改为SystemLookAndFeel
时,它实际上直接链接到LookAndFeel(我正在运行Win10)。
这似乎是(或曾经是)一个错误-请参见https://bugs.openjdk.java.net/browse/JDK-8152981(引用来自this thread)。
这似乎是故意的,我没有找到完全删除图标间距的方法。
将其添加到JMenuItem
可以帮助:
menuItem.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
这将更改组件的方向,从而删除左侧的空间。负面影响:它将使空间移到右侧。尽管如此,也许这对您有用。
我发现的另一种方法是,这种方法只有在您从未使用JMenuItem
中的任何图标的情况下才有效:
item.setMargin(new Insets(2,-20,2,2));
您可以根据需要调整这些值。 我不知道这些变通办法是否会产生副作用,我只是整理了在该问题上发现的内容。