Swing/AdjustPopupLocation のバックアップ差分(No.5)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/AdjustPopupLocation へ行く。
- 1 (2018-02-15 (木) 14:23:42)
- 2 (2018-04-26 (木) 15:00:17)
- 3 (2020-04-22 (水) 18:49:29)
- 4 (2021-05-31 (月) 15:28:12)
- 5 (2022-08-19 (金) 12:18:04)
- 追加された行はこの色です。
- 削除された行はこの色です。
---
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");
JLabel label = new JLabel("aaaaaaaaaaaa");
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