Swing/RemoveButtonInComboItem のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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)
TITLE:JComboBoxのドロップダウンリストにJButtonを追加
Posted by aterai at 2012-07-09
JComboBoxのドロップダウンリストにJButtonを追加
JButtonのドロップダウンリストで、各アイテムにクリック可能なJButtonを追加しこれを削除します。
- &jnlp;
- &jar;
- &zip;
サンプルコード
class CellButtonsMouseListener extends MouseAdapter{
private int prevIndex = -1;
private JButton prevButton = null;
@Override public void mouseMoved(MouseEvent e) {
JList list = (JList)e.getComponent();
Point pt = e.getPoint();
int index = list.locationToIndex(pt);
if(!list.getCellBounds(index, index).contains(pt)) {
if(prevIndex>=0) {
Rectangle r = list.getCellBounds(prevIndex, prevIndex);
if(r!=null) {
list.repaint(r);
}
}
index = -1;
prevButton = null;
return;
}
if(index>=0) {
JButton button = getButton(list, pt, index);
ButtonsRenderer renderer = (ButtonsRenderer)list.getCellRenderer();
renderer.button = button;
if(button != null) {
button.getModel().setRollover(true);
renderer.rolloverIndex = index;
if(!button.equals(prevButton)) {
Rectangle r = list.getCellBounds(prevIndex, index);
if(r!=null) {
list.repaint(r);
}
}
}else{
renderer.rolloverIndex = -1;
Rectangle r = null;
if(prevIndex != index) {
r = list.getCellBounds(index, index);
}else if(prevIndex>=0 && prevButton!=null) {
r = list.getCellBounds(prevIndex, prevIndex);
}
if(r!=null) {
list.repaint(r);
}
prevIndex = -1;
}
prevButton = button;
}
prevIndex = index;
}
@Override public void mousePressed(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(button != null) {
ButtonsRenderer renderer = (ButtonsRenderer)list.getCellRenderer();
renderer.button = button;
list.repaint(list.getCellBounds(index, index));
}
}
}
@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(button != null) {
ButtonsRenderer renderer = (ButtonsRenderer)list.getCellRenderer();
renderer.button = null;
button.doClick();
Rectangle r = list.getCellBounds(index, index);
if(r!=null) {
list.repaint(r);
}
}
}
}
@SuppressWarnings("unchecked")
private static JButton getButton(JList list, Point pt, int index) {
Container c = (Container)list.getCellRenderer().getListCellRendererComponent(
list, "", index, false, false);
Rectangle r = list.getCellBounds(index, index);
c.setBounds(r);
pt.translate(0,-r.y);
Component b = SwingUtilities.getDeepestComponentAt(c, pt.x, pt.y);
if(b instanceof JButton) {
return (JButton)b;
}else{
return null;
}
}
}
View in GitHub: Java, Kotlin解説
JComboBoxのドロップダウンリスト(BasicComboPopup)からJListを取得し、これに上記のようなMouseListenerを追加しています。このJListがクリックされた場合、レンダラーから対応するセルに表示されているJButtonを取得し、button.doClick()を呼び出します。
Accessible a = getAccessibleContext().getAccessibleChild(0);
if(a instanceof BasicComboPopup) {
BasicComboPopup pop = (BasicComboPopup)a;
JList list = pop.getList();
CellButtonsMouseListener cbml = new CellButtonsMouseListener();
list.addMouseListener(cbml);
list.addMouseMotionListener(cbml);
}
- メモ: 削除ボタンがクリックされてもドロップダウンリストは表示されたままになるように、MutableComboBoxModel#removeElementAt(index);のあとでcomboBox.showPopup();
- BasicComboPopup が、フレーム外に表示されている場合(Heavy weight)、一旦閉じたあとで再度開かれるように見える