概要

JPopupMenuを設定したコンポーネントの表示領域内に収まるように、JPopupMenuの表示位置を調整します。

サンプルコード

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("JMenuItem: 11111");
popup.add("JMenuItem: 222");
popup.add("JMenuItem: 3");

JLabel label = new JLabel("JLabel: 1234567890");
label.setOpaque(true);
label.setComponentPopupMenu(popup);
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、JPopupMenu#show(...)メソッドをオーバーライドし、JPopupMenuの表示位置を調整することでコンポーネント(この場合JLabel)の表示領域内にJPopupMenu全体が収まるように設定しています。

  • 親コンポーネントの右下で右クリックによるJPopupMenuの表示を行った場合、そのクリック位置にJPopupMenuの右下隅が重なるように表示
  • JPopupMenuのサイズが親コンポーネントの表示上のサイズより大きくなる場合は考慮していない
    • JPopupMenuの高さが親コンポーネントの高さより高い場合、クリックした位置とは無関係にJPopupMenuの上辺が親コンポーネントの上辺と同じ位置になるよう表示

参考リンク

コメント