如何从JMenuItemJava Swing中删除空白图标间隙?

问题描述

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摆脱这些图标?

要获得更好的主意,您可以在下面找到一些图片。 这是主菜单栏:

MainMenu

这是我刚刚创建的一个简单的弹出菜单

PopupMenu

这是我尝试使用的代码,以消除差距:

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

您可以根据需要调整这些值。 我不知道这些变通办法是否会产生副作用,我只是整理了在该问题上发现的内容。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...