JCheckBoxのRolloverIconを変更する
Total: 604
, Today: 1
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JCheckBox
がマウスオーバー状態になったときに表示されるRolloverIcon
を変更します。
Screenshot
Advertisement
サンプルコード
// UIManager
class CheckBoxIcon implements Icon {
private final Icon checkIcon = UIManager.getIcon("CheckBox.icon");
@Override public void paintIcon(Component c, Graphics g, int x, int y) {
if (c instanceof AbstractButton) {
Graphics2D g2 = (Graphics2D) g.create();
g2.translate(x, y);
AbstractButton b = (AbstractButton) c;
ButtonModel model = b.getModel();
if (!model.isSelected() && model.isRollover()) {
checkIcon.paintIcon(c, g2, 0, 0);
g2.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, .2f));
b.setSelected(true);
checkIcon.paintIcon(b, g2, 0, 0);
b.setSelected(false);
} else {
checkIcon.paintIcon(c, g2, 0, 0);
}
g2.dispose();
}
}
@Override public int getIconWidth() {
return checkIcon.getIconWidth();
}
@Override public int getIconHeight() {
return checkIcon.getIconHeight();
}
}
// UIDefaults
JCheckBox check3 = new JCheckBox("CheckBox[MouseOver].iconPainter") {
@Override public void updateUI() {
super.updateUI();
UIDefaults d = UIManager.getLookAndFeelDefaults();
Painter<JCheckBox> painter0 = getIconPainter(d, "Focused+Selected");
Painter<JCheckBox> painter1 = getIconPainter(d, "MouseOver");
Painter<JCheckBox> painter2 = (g, object, width, height) -> {
painter1.paint(g, object, width, height);
Graphics2D g2 = (Graphics2D) g.create();
g2.setPaint(Color.WHITE);
g2.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, .2f));
object.setSelected(true);
painter0.paint(g2, object, width, height);
object.setSelected(false);
g2.dispose();
};
d.put("CheckBox[MouseOver].iconPainter", painter2);
d.put("CheckBox[Focused+MouseOver].iconPainter", painter2);
putClientProperty("Nimbus.Overrides", d);
putClientProperty("Nimbus.Overrides.InheritDefaults", true);
}
};
View in GitHub: Java, Kotlin解説
JCheckBox.setRolloverIcon(...)
JCheckBox#setRolloverIcon(...)
でRolloverIcon
を変更MetalLookAndFeel
やWindowsLookAndFeel
ではJCheckBox#setIcon(...)
でデフォルトのIcon
を変更しないとJCheckBox#setRolloverIcon(...)
で設定したRolloverIcon
は使用されない?NimbusLookAndFeel
ではJCheckBox#setRolloverIcon(...)
単独で有効になる
UIManager CheckBox.icon
UIManager.getIcon("CheckBox.icon")
でチェックアイコンを取得してこれをラップするアイコンをJCheckBox#setIcon(...)
で設定- ラップしたアイコンの
Icon#paintIcon(...)
をオーバーライドし、ButtonModel#isRollover()
の場合は透明化したチェックアイコンを上書きする NimbusLookAndFeel
のNimbusIcon
ではこの方法は使用できない
UIDefaults CheckBox[MouseOver].iconPainter
UIManager.getLookAndFeelDefaults()
でUIDefaults
を取得して、CheckBox[Focused+Selected].iconPainter
状態などで使用するPainter
を取得- 取得した
Painter
をラップするPainter
を作成してPainter#paint(...)
をオーバーライドし、透明化したチェックアイコンを上書きするよう設定 CheckBox[MouseOver].iconPainter
状態で使用するPainter
をこのラップしたPainter
で置き換えSynthLookAndFeel
系のNimbusLookAndFeel
などでのみこの方法は有効