JRadioButtonMenuItemのチェックアイコンを非表示にしてテキストオフセットを縮小する
Total: 581
, Today: 1
, Yesterday: 2
Posted by aterai at
Last-modified:
概要
JRadioButtonMenuItem
のチェックアイコンの非表示化し、その余白を最小テキストオフセットを変更することで縮小します。
Screenshot
Advertisement
サンプルコード
UIManager.put(PRE + "minimumTextOffset", 10);
UIManager.put(PRE + "afterCheckIconGap", 0);
UIManager.put(PRE + "checkIconOffset", 0);
Icon checkIcon = getCheckIcon();
int height = checkIcon == null ? 22 : checkIcon.getIconHeight();
UIManager.put(PRE + "checkIcon", new EmptyIcon());
Dimension d = new Dimension(100, height);
JPopupMenu popup = new JPopupMenu();
ButtonGroup bg = new ButtonGroup();
Arrays.asList(
makeMenuItem("0.5 pt", .5f, d),
makeMenuItem("0.75 pt", .75f, d),
makeMenuItem("1 pt", 1f, d),
makeMenuItem("1.5 pt", 1.5f, d),
makeMenuItem("2.25 pt", 2.25f, d),
makeMenuItem("3 pt", 3f, d)
).forEach(m -> {
popup.add(m);
bg.add(m);
});
View in GitHub: Java, Kotlin解説
UIManager.put("RadioButtonMenuItem.minimumTextOffset", 10)
- 最小テキストオフセットで
RadioButtonMenuItem
のチェックアイコンが表示される領域の幅を指定 WindowsLookAndFeel
のデフォルトは31
- このサンプルでは
10
に縮小
- 最小テキストオフセットで
UIManager.put("RadioButtonMenuItem.afterCheckIconGap", 0)
- チェックアイコンと
JRadioButtonMenuItem
のテキストまたはアイコンとの間隔 WindowsLookAndFeel
のデフォルトは9
- チェックアイコンと
UIManager.put("RadioButtonMenuItem.checkIconOffset", 0)
JRadioButtonMenuItem
の左端とチェックアイコンとの間隔WindowsLookAndFeel
のデフォルトは0
UIManager.put("RadioButtonMenuItem.checkIcon", new EmptyIcon())
JRadioButtonMenuItem
のチェックアイコン- このサンプルではサイズ
0
のアイコンを設定してチェックアイコンを非表示化- アイコンでの選択状態表示の代わりに
JRadioButtonMenuItem#paintComponent(...)
をオーバーライドして選択状態の場合はその背景色を変更している
- アイコンでの選択状態表示の代わりに
WindowsLookAndFeel
のデフォルトはサイズ22x22
のアイコンJMenuItem
にも非表示のチェックアイコンが存在するためRadioButtonMenuItem.minimumTextOffset
だけでなくチェックアイコンのサイズも変更しないとJMenuItem
の左余白サイズを変更できない
setHorizontalTextPosition(...)
,setHorizontalAlignment(...)
JRadioButtonMenuItem
のデフォルト揃えはsetHorizontalTextPosition(TRAILING)
,setHorizontalAlignment(LEADING)
だが、このサンプルでは以下のようにsetHorizontalTextPosition(LEADING)
,setHorizontalAlignment(TRAILING)
と反転し、0.5 pt
などのテキストを右揃えで左側、その太さを表示するアイコンを右側に配置している
private static JMenuItem makeMenuItem(String txt, float width, Dimension d) {
float px = width * Toolkit.getDefaultToolkit().getScreenResolution() / 72f;
return new JRadioButtonMenuItem(txt, new LineIcon(new BasicStroke(px), d)) {
@Override protected void init(String text, Icon icon) {
super.init(text, icon);
setHorizontalTextPosition(LEADING);
setHorizontalAlignment(TRAILING);
}
@Override protected void paintComponent(Graphics g) {
if (isSelected()) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setPaint(new Color(0xAA_64_AA_FF, true));
g2.fillRect(0, 0, getWidth(), getHeight());
g2.dispose();
}
super.paintComponent(g);
}
};
}