2012-01-06 1 views
3

При добавлении пункта меню (как жестко, как в моем примере ниже или с действием) цвет значка вызывает цвет текста элемента меню изменение. Это странно, и в случае белого или очень светлого значка может привести к тому, что элемент меню станет нечитаемым. Как отключить это? Вызов setForeground(Color.black) по пункту меню не работает.Значок настройки в JMenuItem делает цвет значка текста меню

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); 
    } 
} 

EDIT: Это происходит в Mac Аква L & F и в Windows, в моем приложении. SSCCE также вызывает это на Mac, но, как ни странно, в Windows. (В Windows существуют другие различия в пользовательском интерфейсе: у SSCCE есть вертикальный разделитель между значком и текстом, а в моем приложении нет.)

+0

В качестве альтернативы рассмотрите использование смещений 'x' и' y' в реализации 'paintIcon()'. – trashgod

+0

@trashgod Я обычно делаю, но для этой демонстрации это было необязательно. Спасибо за примечание в любом случае. – CajunLuke

ответ

4

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

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