Swing/DropDownHeightResizing のバックアップ(No.3)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/DropDownHeightResizing へ行く。
- 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
概要
JComboBox
のドロップダウンリス下部にドラッグ可能なアイコンを追加し、その高さをマウスドラッグで変更します。
Screenshot
Advertisement
サンプルコード
JLabel bottom = new JLabel("", new DotIcon(), SwingConstants.CENTER);
MouseInputListener rwl = new ResizeWindowListener();
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 ResizeWindowListener extends MouseInputAdapter {
private final Rectangle rect = new Rectangle();
@Override public void mousePressed(MouseEvent e) {
Window w = SwingUtilities.getWindowAncestor(e.getComponent());
if (w != null) {
rect.setSize(w.getSize());
}
}
@Override public void mouseDragged(MouseEvent e) {
Window w = SwingUtilities.getWindowAncestor(e.getComponent());
if (!rect.isEmpty() && w != null) {
rect.height += e.getY();
w.setSize(rect.width, rect.height);
}
}
}
JComboBox
JComboBox
本来のドロップダウンリストはJComboBox.setMaximumRowCount(1)
で高さ最小に設定し、PopupMenuListener#popupMenuWillBecomeVisible(...)
で上記のJPopupMenu
を手前に重ねて表示- 手前に表示する
JPopupMenu
はInvoker
をJComboBox
ではなくnull
に設定しているのでSwingUtilities.getWindowAncestor(JLabel)
でJPopupMenu
の親フレームが取得可能Invoker
をJComboBox
に設定するとJComboBox
の親フレームが返ってきてしまう
Invoker
がnull
なのでJComboBox
の親フレームをクリックしたりリサイズしてもJPopupMenu
は自動的に非表示にはならない- このサンプルではその親フレームに
ComponentListener
などを追加してJPopupMenu
を非表示に変更している
- このサンプルではその親フレームに
JList
- 手前に表示する
JPopupMenu
に追加したJList
のアイテム選択とJComboBox
のドロップダウンリストの選択状態をItemListener
を追加して同期 JList
にMouseListener
を追加してダブルクリックでJComboBox
の選択状態更新とJPopupMenu
の非表示化を実行GraphicsEnvironment#getAllFonts()
で取得したフォント名を一覧表示
- 手前に表示する
参考リンク
- JToggleButtonからポップアップメニューを開く
- JWindow内にフォーカス可能なコンポーネントを配置する
- JComboBoxのドロップダウンリストでセル配置をニュースペーパー・スタイルに設定する
- Fontの一覧を取得する