Java 在JMenuItem上设置图标会挤压其标签文本高度

Java 在JMenuItem上设置图标会挤压其标签文本高度,java,swing,Java,Swing,当向菜单添加纯文本项时,无论是JMenu还是jpopmenu,每个菜单项都有一个高度,大概是基于它的字体加上一些空白边,这看起来很不错 向项目添加图标会使项目的高度降低到图标的高度。如果图标的高度小于字体的大小,则项目高度显然在字体的最小高度处触底 我能找到的最接近的帖子是,但是颜色在这里不是问题。我使用了类似的SSCCE: import java.awt.*; import javax.swing.*; public class SquishText extends JFrame {

当向菜单添加纯文本项时,无论是JMenu还是jpopmenu,每个菜单项都有一个高度,大概是基于它的字体加上一些空白边,这看起来很不错

向项目添加图标会使项目的高度降低到图标的高度。如果图标的高度小于字体的大小,则项目高度显然在字体的最小高度处触底

我能找到的最接近的帖子是,但是颜色在这里不是问题。我使用了类似的SSCCE:

import java.awt.*;
import javax.swing.*;

public class SquishText extends JFrame
{
    public SquishText()
    {
        JMenu menu = new JMenu("a menu");

        menu.add(new JMenuItem("item with no icon"));
        menu.add(new JMenuItem("label text goes here", new Icon(){
            @Override
            public void paintIcon (Component c, Graphics g, int x, int y) {
                ((Graphics2D)g).fill3DRect (0, 0, 8, 8, true);
            }
            @Override
            public int getIconWidth() {
                return 8;
            }
            @Override
            public int getIconHeight() {
                return 8;
            }
        }));
        menu.add(new JMenuItem("another item with no icon"));

        JMenuBar menubar = new JMenuBar();
        menubar.add(menu);
        this.setJMenuBar(menubar);
    }


    public static void main (String[] args) throws Exception
    {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SquishText wtf = new SquishText();
        wtf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        wtf.setVisible(true);
    }
}
结果如下:

将鼠标悬停在菜单项上会显示中间项的高度明显变小且难看

为了在我们的实际代码中添加图标,他们尝试了我们在动作上设置数据的首选方法

action.putValue (Action.SMALL_ICON, the_icon_instance);
作为一种不顾一切的退路,直接将其设置在创建的JMenuItem上

menu.add(action).setIcon(the_icon_instance);
两种情况下的行为相同,这与SSCCE相匹配。图标是如何添加的似乎并不重要,只是图标存在的事实

这可能是L&F(Windows7上的Java8)的问题,但试图在WindowsLookAndFeel代码中翻找却立即令人困惑

所以他们向我求助,但这是我第一次遇到这样的事情。(我的项目很少在菜单中使用图标。)我觉得整件事都可以在正确的位置使用
setMinimumSize'/'setPreferredSize
来解决,但我觉得其实不需要这样做。。。而且,在渲染之后,我们才知道正常的线高度是多少


我们犯了什么错误?(讨厌的图标,在我的时代,vt100上都是绿色文本,滚出我的草坪,等等)

当图标是常规图像图标时,甚至会出现此问题。看起来真像一只摇摆不定的虫子。@Frakcool谢谢!我没有意识到我们可以在这里做内联,我很感激编辑。一个解决方法是从
getIconWidth()
getIconHeight()
返回一个更大的数字,比如20。这似乎与SwingUtilities.layoutCompoundLabel中的逻辑有关,但我仍在试图理解为什么它在其他外观中没有问题。@VGR有趣。我们的“实际”图标实例都是ImageIcons,但我们可能会混淆一些东西,以便getIcon*getter故意返回较大的值。(诀窍是确保实际图形不使用这些调用。)您还可以使用图像编辑器,或在代码运行时,通过将每个图像绘制到新的20×20 BuffereImage上,用透明像素填充图标图像。