• 締切済み

WinXP JButtonのバックカラーについて

質問させてください。 XPで以下のように LookAndFeelをセットすると、 new JButton().setBackGround(Color.red); でボタンの背景色が変更できずに、ボタンの輪郭部分の色が変更されてしまいます。 try{ UIManager.setLookAndFeel  UIManager.getSystemLookAndFeelClassName());    } catch(Exception e){ } XPのシステムの設定でしかたなさそうですが、 先ほどの回答していただいた方によると、JButtonを継承したクラスを作成して使えばできそうとあったのですが、 具体的な方法がわかりません。 どなたか詳しい方がいらしましたらたら、クラシック表示にしないで、このLookAndFeelの設定でJButtonの背景色を変更する方法を具体的に教えてください。 よろしくお願いいたします。

みんなの回答

  • ssr-y6
  • ベストアンサー率71% (5/7)
回答No.2

 Windowsのボタンの背景色は利用者が設定するものなのでプログラムで変更することはできません。 変更したい場合はボタン全体をプログラムの責任で書き出す必要があります。  以下は、ボタンの表面を独自の形で書き出すサンプルです。 import java.awt.*; import java.awt.event.*; import javax.swing.*; class odbutton extends JButton { Paint P1, P2; boolean F1; public odbutton(Color c) { super(c.toString()); P1 = new GradientPaint((float)0.0, (float)0.0, c, (float)10.0, (float)10.0, Color.YELLOW, true); P2 = new GradientPaint((float)0.0, (float)0.0, c, (float)10.0, (float)10.0, Color.WHITE, true); F1 = false; addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { F1 = true; }; public void mouseReleased(MouseEvent e) { F1 = false; }; }); }; public void paintComponent(Graphics g) { if (F1) ((Graphics2D)g).setPaint(P1); else ((Graphics2D)g).setPaint(P2); g.fillRect(0, 0, getWidth(), getHeight()); if (isFocusOwner()) g.setColor(Color.CYAN); else g.setColor(Color.BLACK); g.drawString(getText(), 10, getHeight() / 2); }; } public class ownerdraw extends JFrame { public ownerdraw() { super("Owner Draw Button"); try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { System.out.println("Fail Look & Feel"); }; setSize(320, 240); getContentPane().add(new odbutton(Color.RED), BorderLayout.NORTH); getContentPane().add(new odbutton(Color.GREEN), BorderLayout.CENTER); JButton BN = new JButton("Normal"); BN.setBackground(Color.BLUE); getContentPane().add(BN, BorderLayout.SOUTH); setVisible(true); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); }; public static void main(String args[]) { new ownerdraw(); }; }

noname#49664
noname#49664
回答No.1

ごく基本的な考えだけですが。以下のようにしてJButtonのサブクラスを定義し、これを利用してはどうですか。 class ○○ extends JButton { public void paintBorder(Graphics g){ ・・・ボーダーの描画処理を書く・・・ } } JButtonを継承してクラスを定義し、その中でpaintBorderメソッドをオーバーライドします。このpaintBorderというのは、コンポーネントのボーダーを描画する処理を行うもので、これをオーバーライドすることによりコンポーネントのGUI表示を変更することができます。  考え方としては、まずgetBackgroundしたColorでコンポーネント全体をfillRectで塗りつぶしておき、後はボタンの輪郭や表示テキストを描画するなどの処理を組み込んでいけばよいでしょう。  基本的な表示ができたら、通常の表示とマウスでプレスした際の表示を切り替えて描画するなどまで考えていけば、より本格的なコンポーネントになります。  ただし、paintBorderをオーバーライドし直接描画することにより、そのままではUIManager.setLookAndFeelが機能しなくなります。これまで対応させ、その上更に特定のプラットフォームの表示のみカスタマイズするのはなかなか難しいでしょう。  要は、どこまで作り込むか、によって難易度は変わってくるわけです。

関連するQ&A