• category: swing folder: CheckBoxColor title: JCheckBoxのチェックアイコンを変更 tags: [JCheckBox, Icon, UIManager] author: aterai pubdate: 2007-04-09T15:16:42+09:00 description: JCheckBoxで使用するチェックアイコンの色や形を変更します。 image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTI225hC_I/AAAAAAAAATc/YxhkQ5Bq2sk/s800/CheckBoxColor.png

概要

概要

JCheckBoxで使用するチェックアイコンの色や形を変更します。

スクリーンショット

CheckBoxColor.png

サンプルコード

サンプルコード

#spandel
class MyCheckBoxIcon2 implements Icon {
#spanend
#spanadd
class CheckBoxIcon2 implements Icon {
#spanend
  private final Icon orgIcon = UIManager.getIcon("CheckBox.icon");
  @Override public void paintIcon(Component c, Graphics g, int x, int y) {
    orgIcon.paintIcon(c, g, x, y);
    AbstractButton b = (AbstractButton) c;
    ButtonModel model = b.getModel();
    g.setColor(new Color(255, 155, 155, 100));
    g.fillRect(x + 2, y + 2, getIconWidth() - 4, getIconHeight() - 4);
    if (model.isSelected()) {
      g.setColor(Color.RED);
      g.drawLine(x + 9, y + 3, x + 9, y + 3);
      g.drawLine(x + 8, y + 4, x + 9, y + 4);
      g.drawLine(x + 7, y + 5, x + 9, y + 5);
      g.drawLine(x + 6, y + 6, x + 8, y + 6);
      g.drawLine(x + 3, y + 7, x + 7, y + 7);
      g.drawLine(x + 4, y + 8, x + 6, y + 8);
      g.drawLine(x + 5, y + 9, x + 5, y + 9);
      g.drawLine(x + 3, y + 5, x + 3, y + 5);
      g.drawLine(x + 3, y + 6, x + 4, y + 6);
    Graphics2D g2 = (Graphics2D) g.create();
    g2.translate(x, y);
    orgIcon.paintIcon(c, g2, 0, 0);
    if (c instanceof AbstractButton) {
      AbstractButton b = (AbstractButton) c;
      ButtonModel model = b.getModel();
      g2.setColor(new Color(255, 155, 155, 100));
      g2.fillRect(2, 2, getIconWidth() - 4, getIconHeight() - 4);
      if (model.isSelected()) {
        g2.setColor(Color.RED);
        g2.drawLine(9, 3, 9, 3);
        g2.drawLine(8, 4, 9, 4);
        g2.drawLine(7, 5, 9, 5);
        g2.drawLine(6, 6, 8, 6);
        g2.drawLine(3, 7, 7, 7);
        g2.drawLine(4, 8, 6, 8);
        g2.drawLine(5, 9, 5, 9);
        g2.drawLine(3, 5, 3, 5);
        g2.drawLine(3, 6, 4, 6);
      }
    }
    g2.dispose();
  }
#spanadd

#spanend
  @Override public int getIconWidth() {
    return orgIcon.getIconWidth();
  }
#spanadd

#spanend
  @Override public int getIconHeight() {
    return orgIcon.getIconHeight();
  }
}
View in GitHub: Java, Kotlin

解説

  • org
    • 通常のJCheckBoxです。
  • check1
    • com/sun/java/swing/plaf/windows/WindowsIconFactory.javaから、XPスタイルではない場合のアイコンをコピーし、一部色などを変更しています。
  • check2
    • UIManager.getIcon("CheckBox.icon")で取得したオリジナルのアイコンを、アルファ値を設定した色で上書きし、チェック(レ)も色を変えて塗り潰しています。ただしチェックの形はWindowsIconFactoryからコピーしているので、別のLookAndFeelでは枠からはみ出してしまいます。
  • check3
    • javax.swing.plaf.metal.MetalCheckBoxIconをアルファ値を設定した色で上書きしています。

解説

  • Default
    • デフォルトのJCheckBox
  • WindowsIconFactory
    • com/sun/java/swing/plaf/windows/WindowsIconFactory.javaからXPスタイルではない場合のアイコンをコピーし、一部色などを変更
  • CheckBox.icon+RED
    • UIManager.getIcon("CheckBox.icon")で取得したオリジナルのアイコンをアルファ値を設定した色で上書きし、✔マークも色を変えて塗り潰し
    • チェックの形はWindowsIconFactoryからコピーしているのでWindowsLookAndFeel以外では枠からはみ出してしまう
  • MetalCheckBoxIcon+GRAY
    • javax.swing.plaf.metal.MetalCheckBoxIconをアルファ値を設定した色で上書き
check1check3で生成したアイコンを、それぞれJCheckBox#setIconで設定しています。
  • -
  • Windows XPスタイル以外を使用する環境で色を変更する場合は以下のような方法もある
XPスタイルで無い場合(Windows環境以外ではテストしていない)、色を変更するだけなら、以下のようにする方法もあります。
System.setProperty("swing.noxp", "true");
UIManager.put("CheckBox.interiorBackground", new ColorUIResource(Color.GREEN));
UIManager.put("CheckBox.darkShadow", new ColorUIResource(Color.RED));
JCheckBox cb = new JCheckBox("check box");

参考リンク

  • 進歩したSynth
    • SynthLookAndFeelを使って、画像でチェックを描画するサンプルなどが紹介されています。

参考リンク

  • 進歩したSynth
    • SynthLookAndFeelを使って、画像でチェックを描画するサンプルなどが紹介されている

コメント

コメント