Swing/PopupMenuWidth の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/PopupMenuWidth へ行く。
- Swing/PopupMenuWidth の差分を削除
--- category: swing folder: PopupMenuWidth title: JPopupMenuの最小幅を設定する tags: [JPopupMenu, JMenu, JMenuItem, LayoutManager] author: aterai pubdate: 2017-07-17T23:29:21+09:00 description: JPopupMenuに下限となる最小幅を固定値で設定します。 image: https://drive.google.com/uc?id=1SYHBxJoZ2kPCmF9HQVhg0esnQTnpSZpq5w --- * 概要 [#summary] `JPopupMenu`に下限となる最小幅を固定値で設定します。 #download(https://drive.google.com/uc?id=1SYHBxJoZ2kPCmF9HQVhg0esnQTnpSZpq5w) * サンプルコード [#sourcecode] #code(link){{ menu = new JMenu("BoxHStrut"); menu.add(Box.createHorizontalStrut(200)); }} * 解説 [#explanation] - `Default` -- `JMenu`に配置されたコンポーネントの最も大きな推奨サイズの幅から`JPopupMenu`の幅が決まる - `BoxHStrut` -- `Box.createHorizontalStrut(200)`で高さ`0`で任意の幅のコンポーネントを作成して`JMenu`に配置 -- `Box.createHorizontalStrut(...)`で高さ`0`で任意の幅(このサンプルでは`200`)のコンポーネントを作成して`JMenu`に配置 -- この`Box`の幅が`JPopupMenu`の最小幅になる -- この`Box`は`MenuElement`インタフェースに適合しないので`JMenu#getSubElements()`の戻り値には含まれない --- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JMenu.html#getSubElements-- JMenu#getSubElements() (Java Platform SE 8)] - `Override` -- `JMenu`に配置する`JMenuItem`の`getPreferredSize()`メソッドをオーバーライドして任意の幅を返すように設定 -- この`JMenuItem`の幅が`JPopupMenu`の最小幅になる - `Layout` -- `JMenu`が使用する`JPopupMenu`のレイアウトを変更 -- `DefaultMenuLayout#preferredLayoutSize(...)`メソッドをオーバーライドして任意の幅を返すように設定 #code{{ 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`が表示できない * 参考リンク [#reference] - [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/plaf/basic/DefaultMenuLayout.html DefaultMenuLayout (Java Platform SE 8)] * コメント [#comment] #comment #comment