概要

JPopupMenuに下限となる最小幅を固定値で設定します。

サンプルコード

menu = new JMenu("BoxHStrut");
menu.add(Box.createHorizontalStrut(200));
View in GitHub: Java, Kotlin

解説

  • Default
    • JMenuに配置されたコンポーネントの最も大きな推奨サイズの幅からJPopupMenuの幅が決まる
  • BoxHStrut
    • Box.createHorizontalStrut(200)で高さ0で任意の幅のコンポーネントを作成してJMenuに配置
    • このボックスの幅がJPopupMenuの最小幅になる
    • このボックスはMenuElementインタフェースに適合しないので、JMenu#getSubElements()などには含まれない
  • Override
    • JMenuに配置するJMenuItemgetPreferredSize()メソッドをオーバーライドして、任意の幅を返すように設定
    • このJMenuItemの幅がJPopupMenuの最小幅になる
  • Layout
    • JMenuが使用するJPopupMenuのレイアウトを変更
    • DefaultMenuLayout#preferredLayoutSize(...)メソッドをオーバーライドして、任意の幅を返すように設定
      popup.setLayout(new DefaultMenuLayout(popup, BoxLayout.Y_AXIS) {
        @Override public Dimension preferredLayoutSize(Container target) {
          Dimension d = super.preferredLayoutSize(target);
          d.width = Math.max(200, d.width);
          return d;
        }
      });
      
  • Html
    • 余白などを0にし、幅を設定した<table>タグで装飾した文字列を使用するJMenuItemを使用
      • new JMenuItem("<html><table cellpadding='0' cellspacing='0' style='width:200'>...")
    • 文字列自体の幅が<table>で指定した幅になるので、Acceleratorなどが存在するとその幅も追加される
    • htmlタグを使用するので、Mnemonicが表示できない

参考リンク

コメント