概要

JRadioButtonMenuItemのチェックアイコンの非表示化し、その余白を最小テキストオフセットを変更することで縮小します。

サンプルコード

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);
    }
  };
}

参考リンク

コメント