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

标签 java swing imageicon jmenuitem

长话短说

有没有办法消除 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());

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

有没有办法强制用户界面摆脱那些图标?

为了更好地了解您可以在后面找到一些图片。 这是主菜单栏:

MainMenu

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

PopupMenu

这是我试图用来消除差距的代码:

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

最佳答案

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

不过,将此添加到 JMenuItem 会有所帮助:

menuItem.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);

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

我发现的另一种方法是这样的:

item.setMargin(new Insets(2, -20, 2, 2));

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

关于java - 如何从 JMenuItem (Java Swing) 中删除空图标间隙?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64590384/

相关文章:

java - Log4j 输出未显示在 Eclipse 控制台中

java - 将 GUI 分成几类

java - 将按钮添加到从数据库中的数据动态生成的表中的列 java swing

java - 图像与 Java 树节点对象的关联

java - 无法在 JLabel 上显示图像

java - 动态配置数据源

java - 在java中通过字符串切换大小写 < 1.7

java - 这个算法的时间复杂度是O(N^2)吗?

java - 为所有 JLabel 设置背景/不透明

java - JFrame 的默认图标在动态更新期间间歇性地显示在 Win 任务栏中