JPopupMenuにマウスドラッグで位置変更を可能にするヘッダを追加する
Total: 853
, Today: 1
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JPopupMenu
にJLabel
で作成したヘッダを追加し、MouseListener
を追加してドラッグで位置変更を可能にします。
Screenshot
Advertisement
サンプルコード
class PopupHeaderMouseListener extends MouseAdapter {
private final Point startPt = new Point();
@Override public void mousePressed(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
startPt.setLocation(e.getPoint());
}
}
@Override public void mouseDragged(MouseEvent e) {
Component c = e.getComponent();
Window w = SwingUtilities.getWindowAncestor(c);
if (w != null && SwingUtilities.isLeftMouseButton(e)) {
if (w.getType() == Window.Type.POPUP) { // Popup$HeavyWeightWindow
Point pt = e.getLocationOnScreen();
w.setLocation(pt.x - startPt.x, pt.y - startPt.y);
} else { // Popup$LightWeightWindow
Container popup = SwingUtilities.getAncestorOfClass(
JPopupMenu.class, c);
Point pt = popup.getLocation();
popup.setLocation(
pt.x - startPt.x + e.getX(), pt.y - startPt.y + e.getY());
}
}
}
}
View in GitHub: Java, Kotlin解説
JPopupMenu
のデフォルトレイアウトは垂直BoxLayout
なので、ドラッグ可能なヘッダとして使用するJLabel
はgetMaximumSize()
をオーバーライドして最大幅をJPopupMenu
の推奨幅以上に設定しておくJPopupMenu
の幅スペースを残さないようヘッダの幅が水平方向に引き伸ばすために必要な設定- JComboBoxのドロップダウンリストにヘッダ・フッタを追加する
GTKLookAndFeel
ではheader.setAlignmentX(Component.CENTER_ALIGNMENT)
を設定しないとヘッダ左側に余白が生成される場合がある?
JPopupMenu
が親JFrame
外に表示されてPopup$HeavyWeightWindow
になる場合:MouseEvent#getLocationOnScreen()
で取得したデスクトップ領域の絶対位置にSwingUtilities.getWindowAncestor(header)
で取得したJPopupMenu
の親Window
を移動- JWindowをマウスで移動
JPopupMenu
が親JFrame
内に表示されてPopup$LightWeightWindow
になる場合:SwingUtilities.getAncestorOfClass(JPopupMenu.class, header)
で取得したJPopupMenu
の位置を変更- JComboBoxのドロップダウンリストの高さをマウスドラッグで変更する
参考リンク
- JComboBoxのドロップダウンリストにヘッダ・フッタを追加する
- JToggleButtonからポップアップメニューを開く
- JComboBoxのドロップダウンリストの高さをマウスドラッグで変更する
- JWindowをマウスで移動