如何从 JMenuItem (Java Swing) 中删除空图标间隙?

Iam*_*ino 4 java swing jmenuitem imageicon

长话短说

有没有办法消除 MenuItem 边框和定义文本之间的图标间隙?即使我没有设置图标,或者将图标设置为空,它也会在我创建菜单项时立即出现。

长版

我们公司开发的 Java 应用程序自 20 世纪 90 年代就存在。在 2000 年代,它被重新设计,并且曾经有那些可怕的、呃我的意思是花哨和丰富多彩的“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());
Run Code Online (Sandbox Code Playgroud)

到目前为止没有任何帮助。 有谁知道这种行为可能来自哪里?我应该在哪里查找以找到此错误配置?

有什么办法可以强制用户界面摆脱这些图标吗?

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

主菜单

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

弹出菜单

这是我尝试使用的代码来消除间隙:

jMenuItem1.setIcon(null);
jMenuItem1.setHorizontalAlignment(JMenuItem.LEFT);
jMenuItem1.setHorizontalTextPosition(JMenuItem.LEFT);
jMenuItem1.setIconTextGap(0);
jMenuItem1.setMargin(new Insets(0, 0, 0, 0));
jMenuItem1.setPressedIcon(null);
jMenuItem1.setText("TEST TEST TEST");
Run Code Online (Sandbox Code Playgroud)

mal*_*ter 6

我尝试复制这个,结果发现它实际上是直接链接到LookAndFeel,当它更改为SystemLookAndFeel(我运行的是Win10)时。 似乎这是(或曾经是)一个错误 - 请参阅https://bugs.openjdk.java.net/browse/JDK-8152981(参考来自此线程)。 这似乎是故意的,我没有找到完全删除图标间距的方法。

不过,将其添加到JMenuItem帮助中:

menuItem.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
Run Code Online (Sandbox Code Playgroud)

这将改变组件的方向,从而消除左侧的空间。负面影响:它将空间移到右侧。尽管如此,也许这对你有用。

JMenuItem我发现的另一种方法是这样的,我认为只有当您从不使用任何图标时才有效:

item.setMargin(new Insets(2, -20, 2, 2));
Run Code Online (Sandbox Code Playgroud)

您可以根据需要调整这些值。我不知道这些解决方法是否有任何副作用,我只是编译了我在该问题上发现的内容。