JComboBoxのドロップダウンリストの高さをマウスドラッグで変更する
Total: 1658, Today: 3, Yesterday: 1
Posted by aterai at
Last-modified:
Summary
JComboBoxのドロップダウンリスト下部にドラッグ可能なアイコンを追加し、その高さをマウスドラッグで変更します。
Screenshot

Advertisement
Source Code Examples
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, KotlinDescription
JPopupMenuJPopupMenu内に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(); } } } }
- この
JComboBoxJComboBox本来のドロップダウンリストは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()で取得したフォント名を一覧表示
- 手前に表示する
Reference
- JToggleButtonからポップアップメニューを開く
- JWindow内にフォーカス可能なコンポーネントを配置する
- JComboBoxのドロップダウンリストでセル配置をニュースペーパー・スタイルに設定する
- Fontの一覧を取得する