Swing/DropDownHeightResizing のバックアップ(No.9)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/DropDownHeightResizing へ行く。
- 1 (2022-06-20 (月) 00:46:32)
- 2 (2022-06-24 (金) 18:21:18)
- 3 (2022-06-30 (木) 18:22:18)
- 4 (2022-07-10 (日) 04:38:26)
- 5 (2022-07-25 (月) 14:04:01)
- 6 (2022-07-29 (金) 11:27:56)
- 7 (2022-10-30 (日) 19:00:29)
- 8 (2025-01-03 (金) 08:57:02)
- 9 (2025-01-03 (金) 09:01:23)
- 10 (2025-01-03 (金) 09:02:38)
- 11 (2025-01-03 (金) 09:03:21)
- 12 (2025-01-03 (金) 09:04:02)
- category: swing
folder: DropDownHeightResizing
title: JComboBoxのドロップダウンリストの高さをマウスドラッグで変更する
tags: [JComboBox, JList, JPopupMenu]
author: aterai
pubdate: 2022-06-20T00:37:46+09:00
description: JComboBoxのドロップダウンリスト下部にドラッグ可能なアイコンを追加し、その高さをマウスドラッグで変更します。
image: https://drive.google.com/uc?id=1UN09ThQIcw2H8XpxI6ZpY2HOzFytr1-J
hreflang:
href: https://java-swing-tips.blogspot.com/2022/06/change-height-of-drop-down-list-of.html lang: en
Summary
JComboBox
のドロップダウンリスト下部にドラッグ可能なアイコンを追加し、その高さをマウスドラッグで変更します。
Screenshot
![Swing/DropDownHeightResizing screenshot](https://ateraimemo.com/swing/dropdownheightresizing/screenshot.png)
Advertisement
サンプルコード
JPopupMenu popup = new JPopupMenu();
popup.setBorder(BorderFactory.createEmptyBorder());
popup.setPopupSize(240, 120);
JLabel bottom = new JLabel("", new DotIcon(), SwingConstants.CENTER);
MouseInputListener rwl = new ResizeWindowListener(popup);
bottom.addMouseListener(rwl);
bottom.addMouseMotionListener(rwl);
bottom.setCursor(Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR));
bottom.setOpaque(true);
bottom.setBackground(new Color(0xE0_E0_E0));
bottom.setFocusable(false);
JPanel resizePanel = new JPanel(new BorderLayout());
resizePanel.add(scroll);
resizePanel.add(bottom, BorderLayout.SOUTH);
resizePanel.add(Box.createHorizontalStrut(240), BorderLayout.NORTH);
resizePanel.setBorder(BorderFactory.createLineBorder(new Color(0x64_64_64)));
JPopupMenu popup = new JPopupMenu();
popup.add(resizePanel);
View in GitHub: Java, Kotlin解説
JPopupMenu
JPopupMenu
内にJMenuItem
ではなくBorderLayout
を設定したJPanel
をひとつ配置- この
JPanel
はBorderLayout.CENTER
にJList
、BorderLayout.SOUTH
に自身の親フレームの高さのみリサイズ可能にするMouseInputListener
を設定したJLabel
を追加class ResizePopupMenuListener extends MouseInputAdapter { private final Rectangle rect = new Rectangle(); private final Point startPt = new Point(); private final Dimension startDim = new Dimension(); @Override public void mousePressed(MouseEvent e) { Container popup = SwingUtilities.getAncestorOfClass( JPopupMenu.class, e.getComponent()); rect.setSize(popup.getSize()); startDim.setSize(popup.getSize()); startPt.setLocation(e.getComponent().getLocationOnScreen()); } @Override public void mouseDragged(MouseEvent e) { rect.height = startDim.height + e.getLocationOnScreen().y - startPt.y; Container c = SwingUtilities.getAncestorOfClass( JPopupMenu.class, e.getComponent()); if (c instanceof JPopupMenu) { JPopupMenu popup = (JPopupMenu) c; popup.setPreferredSize(rect.getSize()); Window w = SwingUtilities.getWindowAncestor(popup); if (w != null && w.getType() == Window.Type.POPUP) { // Popup$HeavyWeightWindow w.setSize(rect.width, rect.height); } else { // Popup$LightWeightWindow popup.pack(); } } } }
- この
JComboBox
JComboBox
本来のドロップダウンリストはJComboBox.setMaximumRowCount(1)
で高さ最小、JComboBox#getPreferredSize()
をオーバーライドして幅が上記のJPopupMenu
以下になるよう設定し、PopupMenuListener#popupMenuWillBecomeVisible(...)
でJPopupMenu
を手前に重ねて表示手前に表示するJPopupMenu
はInvoker
をJComboBox
ではなくnull
に設定しているのでSwingUtilities.getWindowAncestor(JLabel)
でJPopupMenu
の親フレームが取得可能Invoker
をJComboBox
に設定するとJComboBox
の親フレームが返ってきてしまう
Invoker
がnull
なのでJComboBox
の親フレームをクリックしたりリサイズしてもJPopupMenu
は自動的に非表示にはならないこのサンプルではその親フレームにComponentListener
などを追加してJPopupMenu
を非表示に変更している
Invoker
をJComboBox
に設定JPopupMenu
が親フレーム領域内に収まってlight weight popup
(JPopupMenu#getTopLevelAncestor()
でJComboBox
の親フレームが返ってくる)になる場合はJPopupMenu#setPreferredSize(...) + JPopupMenu#pack()
でリサイズJPopupMenu
が親フレーム領域外に高さが拡大されてheavy weight popup
(JPopupMenu#getTopLevelAncestor()
で共用のJWindow
が返ってくる)になる場合はJPopupMenu#setPreferredSize(...) + JWindow#setSize(...)
でリサイズ
JList
- 手前に表示する
JPopupMenu
に追加したJList
のアイテム選択とJComboBox
のドロップダウンリストの選択状態をItemListener
を追加して同期 JList
にMouseListener
を追加してダブルクリックでJComboBox
の選択状態更新とJPopupMenu
の非表示化を実行GraphicsEnvironment#getAllFonts()
で取得したフォント名を一覧表示
- 手前に表示する
参考リンク
- JToggleButtonからポップアップメニューを開く
- JWindow内にフォーカス可能なコンポーネントを配置する
- JComboBoxのドロップダウンリストでセル配置をニュースペーパー・スタイルに設定する
- Fontの一覧を取得する