Swing/AdjustPopupLocation の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/AdjustPopupLocation へ行く。
- Swing/AdjustPopupLocation の差分を削除
--- category: swing folder: AdjustPopupLocation title: JPopupMenuの表示を親コンポーネント領域内のみに制限する tags: [JPopupMenu] author: aterai pubdate: 2017-05-08T14:26:08+09:00 description: JPopupMenuを設定したコンポーネントの表示領域内に収まるように、JPopupMenuの表示位置を調整します。 image: https://drive.google.com/uc?id=1P6r7-2s31EBtrsPd4FGrzQidQKTrYhS7Wg --- * 概要 [#summary] `JPopupMenu`を設定したコンポーネントの表示領域内に収まるように、`JPopupMenu`の表示位置を調整します。 #download(https://drive.google.com/uc?id=1P6r7-2s31EBtrsPd4FGrzQidQKTrYhS7Wg) * サンプルコード [#sourcecode] #code(link){{ JPopupMenu popup = new JPopupMenu() { @Override public void show(Component c, int x, int y) { if (check.isSelected()) { Point p = new Point(x, y); Rectangle r = c.getBounds(); Dimension d = getPreferredSize(); if (p.x + d.width > r.width) { p.x -= d.width; } if (p.y + d.height > r.height) { p.y -= d.height; } super.show(c, Math.max(p.x, 0), Math.max(p.y, 0)); } else { super.show(c, x, y); } } }; popup.add("aaa"); popup.add("bbbbbb"); popup.add("cc"); popup.add("JMenuItem: 11111"); popup.add("JMenuItem: 222"); popup.add("JMenuItem: 3"); JLabel label = new JLabel("aaaaaaaaaaaa"); JLabel label = new JLabel("JLabel: 1234567890"); label.setOpaque(true); label.setComponentPopupMenu(popup); }} * 解説 [#explanation] 上記のサンプルでは、`JPopupMenu#show(...)`メソッドをオーバーライドし、`JPopupMenu`の表示位置を調整することでコンポーネント(この場合`JLabel`)の表示領域内に`JPopupMenu`全体が収まるように設定しています。 - 親コンポーネントの右下で右クリックによる`JPopupMenu`の表示を行った場合、そのクリック位置に`JPopupMenu`の右下隅が重なるように表示 - `JPopupMenu`のサイズが親コンポーネントの表示上のサイズより大きくなる場合は考慮していない -- `JPopupMenu`の高さが親コンポーネントの高さより高い場合、クリックした位置とは無関係に`JPopupMenu`の上辺が親コンポーネントの上辺と同じ位置になるよう表示 * 参考リンク [#reference] - [[TrayIconでJPopupMenuを使用する>Swing/TrayIconPopupMenu]] - [[JPopupMenuをキー入力で開く場合の表示位置を調整する>Swing/PopupLocation]] * コメント [#comment] #comment #comment