将纯文本项目添加到菜单时,无论是JMenu还是JPopupMenu,每个菜单项的高度可能都基于其字体加上一些空白边缘,看起来不错。
向项目添加图标会使项目的高度降低到图标的高度。如果图标的高度小于字体的大小,则项目高度明显低于字体的最小高度。
我能找到的最近的帖子是Setting icon in JMenuItem makes menu text match icon color,但颜色不是问题。我使用了类似的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);
}
}
结果发布在此处:http://imgur.com/a/J2Upo
鼠标悬停在菜单项上会显示中间条目的高度明显变小和难看。
为了在我们的实际代码中添加图标,他们已经尝试了我们在Action上设置数据的首选方法,
action.putValue (Action.SMALL_ICON, the_icon_instance);
并且作为一个绝望的后备,直接在创建的JMenuItem上设置它,
menu.add(action).setIcon(the_icon_instance);
两种情况下的行为相同,与SSCCE相匹配。 图标的添加方式似乎并不重要,只是图标存在这一事实。
这可能是L& F(Windows 7上的Java 8)的一个问题,但是试图在WindowsLookAndFeel代码中搜索一下就会让人感到困惑。
所以他们已经向我求助了,但这是我第一次遇到这样的事情。 (我的项目很少在菜单中使用图标。)我觉得整个事情可以通过setMinimumSize' / 'setPreferredSize
在正确的位置解决,但我觉得不应该真的需要......而且我们也是无论如何都不知道正常线高 之前是什么。
我们在这里做了什么noob错误? (讨厌的图标,在我的日子里,它是vt100上的所有绿色文字,离开我的草坪等等。)