如何从 JMenuItem (Java Swing) 中删除空图标间隙?
How to remove the empty icon gap from a JMenuItem (Java Swing)?
TL;DR
有没有办法消除 MenuItem 边框和定义文本之间的图标间隙?它会在我创建菜单项后立即出现,即使我没有设置图标,以及如果我将图标设置为空。
长版
我们公司开发的 Java 应用程序从 90 年代就存在了。在 2000 年代,它进行了重新设计,并且曾经有过那些可怕的,eehrm 我的意思是花哨和丰富多彩的“Synthetica”主题之一。所以现在是时候变得更严肃、更有声望了,拥有更优雅、更现代的 L&F。这就是为什么我从 SyntheticaLookAndFeel
切换到 built-in SystemLookAndFeel
.
好吧,这并不像我以前想象的那么容易,但无论如何......我在正确的道路上;)
唯一让我难以正常工作的是那些 MenuItems
。通常在 Java 中,如果您创建一个简单的 Menu 或 PopMenu 并添加一个 JMenuItem,它应该看起来像一个只有文本的普通菜单。在我们的应用程序中,我可以做任何我想做的事,它总是在每个菜单项的左侧显示一个 space。
我搜索了整部作品space 寻找任何(错误的)预设配置。我检查了 UIManager 并尝试了将菜单项图标设置为无的不同方法,但我没有发现任何有用的东西。我什至创建了一个新的 class 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, 0, 0));
jMenuItem1.setPressedIcon(null);
jMenuItem1.setText("TEST TEST TEST");
我试图复制它,结果它实际上直接链接到 LookAndFeel,当它更改为 SystemLookAndFeel
(我是 运行 Win10)时。
这似乎是(或曾经是)一个错误 - 请参阅 https://bugs.openjdk.java.net/browse/JDK-8152981 (reference taken from )。
这似乎是故意的,我没有找到完全删除 icon-spacing.
的方法
尽管将此添加到 JMenuItem
有所帮助:
menuItem.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
这将更改组件方向,从而删除左侧的 space。负 side-effect:它将 space 移到右侧。尽管如此,也许这对你有用。
我发现的另一种方法是这样的:
item.setMargin(new Insets(2, -20, 2, 2));
您可以根据需要调整这些值。
我不知道这些解决方法是否有任何 side-effects,我只是编译了我在这个问题上发现的内容。
TL;DR
有没有办法消除 MenuItem 边框和定义文本之间的图标间隙?它会在我创建菜单项后立即出现,即使我没有设置图标,以及如果我将图标设置为空。
长版
我们公司开发的 Java 应用程序从 90 年代就存在了。在 2000 年代,它进行了重新设计,并且曾经有过那些可怕的,eehrm 我的意思是花哨和丰富多彩的“Synthetica”主题之一。所以现在是时候变得更严肃、更有声望了,拥有更优雅、更现代的 L&F。这就是为什么我从 SyntheticaLookAndFeel
切换到 built-in SystemLookAndFeel
.
好吧,这并不像我以前想象的那么容易,但无论如何......我在正确的道路上;)
唯一让我难以正常工作的是那些 MenuItems
。通常在 Java 中,如果您创建一个简单的 Menu 或 PopMenu 并添加一个 JMenuItem,它应该看起来像一个只有文本的普通菜单。在我们的应用程序中,我可以做任何我想做的事,它总是在每个菜单项的左侧显示一个 space。
我搜索了整部作品space 寻找任何(错误的)预设配置。我检查了 UIManager 并尝试了将菜单项图标设置为无的不同方法,但我没有发现任何有用的东西。我什至创建了一个新的 class 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, 0, 0));
jMenuItem1.setPressedIcon(null);
jMenuItem1.setText("TEST TEST TEST");
我试图复制它,结果它实际上直接链接到 LookAndFeel,当它更改为 SystemLookAndFeel
(我是 运行 Win10)时。
这似乎是(或曾经是)一个错误 - 请参阅 https://bugs.openjdk.java.net/browse/JDK-8152981 (reference taken from
这似乎是故意的,我没有找到完全删除 icon-spacing.
尽管将此添加到 JMenuItem
有所帮助:
menuItem.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
这将更改组件方向,从而删除左侧的 space。负 side-effect:它将 space 移到右侧。尽管如此,也许这对你有用。
我发现的另一种方法是这样的:
item.setMargin(new Insets(2, -20, 2, 2));
您可以根据需要调整这些值。 我不知道这些解决方法是否有任何 side-effects,我只是编译了我在这个问题上发现的内容。