2012-01-06 7 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:これは私のアプリでマックアクアL & FおよびWindowsで発生します。 SSCCEはまた、これをMac上で引き起こしますが、Windowsでは奇妙なことではありません。 (Windowsには他にUIの違いがあります:アイコンとテキストの間にSSCCEに縦の区切りがあります;私のアプリはありません)

+0

さて、あなたの 'paintIcon()'実装で 'x'と' y'オフセットを使うことを考えてみましょう。 – trashgod

+0

@trashgod私はいつもやっていますが、このデモでは不要でした。いずれにしても、メモをありがとう。 – CajunLuke

答えて

4

アイコンとテキストの両方でGraphicsインスタンスが再利用されているようです。 paintIconの最後にg.setColor(Color.BLACK)を追加するとどうなりますか?

これはL & Fのバグだと言います。グラフィックスのオリジナルの色を保存してpaintIconの最後に復元するのが最善です。

関連する問題