JMenuItem中的设置图标使菜单文本与图标颜色匹配

时间:2012-01-06 19:38:35

标签: java swing jmenuitem

添加菜单项(无论是在下面的示例中是硬编码还是使用Action)时,图标的颜色会导致菜单项文本的颜色发生变化。这很奇怪,在白色或非常亮的图标的情况下,可能导致菜单项不可读。我怎么关掉这个?在菜单项上调用setForeground(Color.black)不起作用。

SSCCE:

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

public class Test extends JFrame
{
    public Test()
    {
        JMenuBar bar = new JMenuBar();

        JMenu menu = new JMenu("menu");

        menu.add(new JMenuItem("crap name", new Icon(){
            @Override
            public void paintIcon(Component c, Graphics g, int x, int y) {
                g.setColor(Color.blue);
                ((Graphics2D)g).fill3DRect(0, 0, 8, 8, true);
            }
            @Override
            public int getIconWidth() {
                return 8;
            }
            @Override
            public int getIconHeight() {
                return 8;
            }
        }));

        bar.add(menu);

        setJMenuBar(bar);
    }

    public static void main(String[] args)
    {
        Test app = new Test();
        app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        app.setVisible(true);
    }
}

编辑:这发生在Mac Aqua L& F和我的应用程序的Windows中。 SSCCE也会在Mac上引起这种情况,但奇怪的是,在Windows中。 (Windows中存在其他UI差异:SSCCE在图标和文本之间有一个垂直分隔符;我的应用程序没有。)

1 个答案:

答案 0 :(得分:4)

听起来图形实例正在重复使用图标和文本。在paintIcon的末尾添加g.setColor(Color.BLACK)会发生什么?

我想说这是L& F中的一个错误。也许最好存储图形的原始颜色并在paintIcon结束时恢复它。