Swing/PopupMenuWidth のバックアップの現在との差分(No.5)
- 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
概要
JPopupMenu
に下限となる最小幅を固定値で設定します。
Screenshot
Advertisement
サンプルコード
menu = new JMenu("BoxHStrut");
menu.add(Box.createHorizontalStrut(200));
View in GitHub: Java, Kotlin解説
Default
JMenu
に配置されたコンポーネントの最も大きな推奨サイズの幅からJPopupMenu
の幅が決まる
BoxHStrut
-
Box.createHorizontalStrut(200)
で高さ0
で任意の幅のコンポーネントを作成してJMenu
に配置 -
Box.createHorizontalStrut(...)
で高さ0
で任意の幅(このサンプルでは200
)のコンポーネントを作成してJMenu
に配置 - この
Box
の幅がJPopupMenu
の最小幅になる - この
Box
はMenuElement
インタフェースに適合しないのでJMenu#getSubElements()
などには含まれない - この
Box
はMenuElement
インタフェースに適合しないのでJMenu#getSubElements()
の戻り値には含まれない
-
Override
-
JMenu
に配置するJMenuItem
のgetPreferredSize()
メソッドをオーバーライドして、任意の幅を返すように設定 -
JMenu
に配置するJMenuItem
のgetPreferredSize()
メソッドをオーバーライドして任意の幅を返すように設定 - この
JMenuItem
の幅がJPopupMenu
の最小幅になる
-
Layout
JMenu
が使用するJPopupMenu
のレイアウトを変更-
DefaultMenuLayout#preferredLayoutSize(...)
メソッドをオーバーライドして、任意の幅を返すように設定 -
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
などが存在するとその幅も追加される - 文字列自体の幅が
<table>
で指定した幅になるのでAccelerator
などが存在するとその幅も追加される html
タグを使用するのでMnemonic
が表示できない
- 余白などを