Swing/RemoveButtonInComboItem のバックアップ(No.20)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/RemoveButtonInComboItem へ行く。
- 1 (2012-07-09 (月) 12:02:11)
- 2 (2012-12-08 (土) 06:57:28)
- 3 (2014-09-21 (日) 01:11:16)
- 4 (2014-10-18 (土) 12:25:58)
- 5 (2014-11-23 (日) 17:03:06)
- 6 (2015-02-14 (土) 10:13:00)
- 7 (2015-05-12 (火) 14:34:55)
- 8 (2015-05-12 (火) 15:46:41)
- 9 (2015-05-13 (水) 17:59:10)
- 10 (2016-09-30 (金) 15:44:33)
- 11 (2017-10-29 (日) 13:53:00)
- 12 (2018-02-24 (土) 19:51:30)
- 13 (2019-04-10 (水) 13:58:27)
- 14 (2019-06-05 (水) 15:48:56)
- 15 (2021-02-20 (土) 09:53:08)
- 16 (2025-01-03 (金) 08:57:02)
- 17 (2025-01-03 (金) 09:01:23)
- 18 (2025-01-03 (金) 09:02:38)
- 19 (2025-01-03 (金) 09:03:21)
- 20 (2025-01-03 (金) 09:04:02)
- category: swing
folder: RemoveButtonInComboItem
title: JComboBoxのドロップダウンリストに追加したJButtonで項目を削除する
tags: [JComboBox, JButton, JList, BasicComboPopup, ListCellRenderer, MouseListener]
author: aterai
pubdate: 2012-07-09T12:02:11+09:00
description: JButtonのドロップダウンリストで、各アイテムにクリック可能なJButtonを追加しこれを削除します。
image:
hreflang:
href: https://java-swing-tips.blogspot.com/2012/10/delete-button-in-jcombobox-popup-menu.html lang: en
Summary
JButton
のドロップダウンリストで、各アイテムにクリック可能なJButton
を追加しこれを削除します。
Screenshot

Advertisement
Source Code Examples
class CellButtonsMouseListener extends MouseAdapter {
@Override public void mouseMoved(MouseEvent e) {
JList<?> list = (JList<?>) e.getComponent();
Point pt = e.getPoint();
int index = list.locationToIndex(pt);
ButtonsRenderer<?> renderer = (ButtonsRenderer<?>) list.getCellRenderer();
renderer.rolloverIndex = Objects.nonNull(getButton(list, pt, index)) ? index : -1;
list.repaint();
}
@Override public void mousePressed(MouseEvent e) {
e.getComponent().repaint();
}
@Override public void mouseReleased(MouseEvent e) {
JList<?> list = (JList<?>) e.getComponent();
Point pt = e.getPoint();
int index = list.locationToIndex(pt);
if (index >= 0) {
JButton button = getButton(list, pt, index);
if (Objects.nonNull(button)) {
button.doClick();
}
}
((ButtonsRenderer<?>) list.getCellRenderer()).rolloverIndex = -1;
list.repaint();
}
@Override public void mouseExited(MouseEvent e) {
JList<?> list = (JList<?>) e.getComponent();
((ButtonsRenderer<?>) list.getCellRenderer()).rolloverIndex = -1;
}
private static <E> JButton getButton(JList<E> list, Point pt, int index) {
E proto = list.getPrototypeCellValue();
Component c = list.getCellRenderer().getListCellRendererComponent(
list, proto, index, false, false);
Rectangle r = list.getCellBounds(index, index);
c.setBounds(r);
// c.doLayout(); // may be needed for other layout managers (eg. FlowLayout)
pt.translate(-r.x, -r.y);
return Optional.ofNullable(SwingUtilities.getDeepestComponentAt(c, pt.x, pt.y))
.filter(JButton.class::isInstance).map(JButton.class::cast).orElse(null);
}
}
View in GitHub: Java, KotlinExplanation
JComboBox
のドロップダウンリスト(ComboPopup
)からJList
を取得し、これに上記のようなMouseListener
を追加しています。
JList
がクリックされた場合、レンダラーから対応するセルに表示されているJButton
を取得してJButton#doClick()
メソッドを実行Accessible a = getAccessibleContext().getAccessibleChild(0); if (a instanceof ComboPopup) { ComboPopup pop = (ComboPopup) a; JList list = pop.getList(); CellButtonsMouseListener cbml = new CellButtonsMouseListener(); list.addMouseListener(cbml); list.addMouseMotionListener(cbml); }
- 削除ボタンがクリックされてもドロップダウンリスト(
ComboPopup
)は表示状態のまま残したいMutableComboBoxModel#removeElementAt(index)
のあとでJComboBox#showPopup()
を実行して開き直すComboPopup
がJFrame
の外に表示されている(Heavy weight
)場合、一旦閉じてから再度開く様子が見えてしまう