При настройке значка в JMenuItem цвет текста меню соответствует значку - PullRequest
3 голосов
/ 06 января 2012

При добавлении пункта меню (будь то жестко, как в моем примере ниже или с действием), цвет значка приводит к изменению цвета текста пункта меню. Это странно и, в случае белого или очень светлого значка, может стать причиной нечитаемости пункта меню. Как мне это отключить? Вызов 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 есть и другие отличия пользовательского интерфейса: у SSCCE есть вертикальный разделитель между значком и текстом; у моего приложения нет.)

1 Ответ

4 голосов
/ 07 января 2012

Похоже, что экземпляр Graphics повторно используется как для значка, так и для текста. Что происходит, когда вы добавляете g.setColor (Color.BLACK) в конце paintIcon?

Я бы сказал, что это ошибка в L & F. Возможно, лучше сохранить исходный цвет графики и восстановить его в конце paintIcon.

...