JCheckBoxのRolloverIconを変更する
Total: 1099, Today: 1, Yesterday: 1
Posted by aterai at
Last-modified:
Summary
JCheckBoxがマウスオーバー状態になったときに表示されるRolloverIconを変更します。
Screenshot

Advertisement
Source Code Examples
// 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, KotlinDescription
JCheckBox.setRolloverIcon(...)JCheckBox#setRolloverIcon(...)でRolloverIconを変更MetalLookAndFeelやWindowsLookAndFeelではJCheckBox#setIcon(...)でデフォルトのIconを変更しないとJCheckBox#setRolloverIcon(...)で設定したRolloverIconは使用されない?NimbusLookAndFeelではJCheckBox#setRolloverIcon(...)単独で有効になる
UIManager CheckBox.iconUIManager.getIcon("CheckBox.icon")でチェックアイコンを取得してこれをラップするアイコンをJCheckBox#setIcon(...)で設定- ラップしたアイコンの
Icon#paintIcon(...)をオーバーライドし、ButtonModel#isRollover()の場合は透明化したチェックアイコンを上書きする NimbusLookAndFeelのNimbusIconではこの方法は使用できない
UIDefaults CheckBox[MouseOver].iconPainterUIManager.getLookAndFeelDefaults()でUIDefaultsを取得して、CheckBox[Focused+Selected].iconPainter状態などで使用するPainterを取得- 取得した
PainterをラップするPainterを作成してPainter#paint(...)をオーバーライドし、透明化したチェックアイコンを上書きするよう設定 CheckBox[MouseOver].iconPainter状態で使用するPainterをこのラップしたPainterで置き換えSynthLookAndFeel系のNimbusLookAndFeelなどでのみこの方法は有効