JListをマウスクリックのみで複数選択する Swing ListMouseSelection JListMouseListener en Total: 10557, Today: 2, Yesterday: 2 Posted by aterai at 2011-07-18 Last-modified: 2024-10-23 17:36 概要 JListをアイテムをマウスクリックだけで複数選択できるように設定します。 Screenshot Download Runnable JAR example.jar Source code src.zip Repository GitHub Advertisement サンプルコード JList list = new JList(model) { private ClearSelectionListener listener; @Override public void setSelectionInterval(int anchor, int lead) { if (anchor == lead && lead >= 0 && anchor >= 0) { if (listener.isDragging) { addSelectionInterval(anchor, anchor); } else if (!listener.isInCellDragging) { if (isSelectedIndex(anchor)) { removeSelectionInterval(anchor, anchor); } else { addSelectionInterval(anchor, anchor); } listener.isInCellDragging = true; } } else { super.setSelectionInterval(anchor, lead); } } }; View in GitHub: Java, Kotlin 解説 左: Default Ctrlキーを押しながらマウスクリックでリストアイテムの複数選択が可能 中: MouseEvent JList#processMouseEvent、JList#processMouseMotionEventをオーバーライドして常にCtrlキーが押されている状態に設定 マウスでアイテムをドラッグしても選択状態は変化しない JListの空白部分をクリックした場合、アイテムの選択状態は変更せず(MouseEvent#consume())フォーカスだけJListに移動 参考: Swing - JList where mouse click acts like ctrl-mouse click JList list = new JList(model) { @Override protected void processMouseMotionEvent(MouseEvent e) { super.processMouseMotionEvent(convertMouseEvent(e)); } @Override protected void processMouseEvent(MouseEvent e) { if (e.getID() == MouseEvent.MOUSE_PRESSED && !getCellBounds(0, getModel().getSize() - 1).contains(e.getPoint())) { e.consume(); requestFocusInWindow(); } else { super.processMouseEvent(convertMouseEvent(e)); } } private MouseEvent convertMouseEvent(MouseEvent e) { // Swing - JList where mouse click acts like ctrl-mouse click // https://community.oracle.com/thread/1351452 return new MouseEvent( (Component) e.getSource(), e.getID(), e.getWhen(), // e.getModifiers() | InputEvent.CTRL_MASK, // select multiple objects in OS X: Command+click // pointed out by nsby e.getModifiers() | Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), e.getX(), e.getY(), e.getXOnScreen(), e.getYOnScreen(), e.getClickCount(), e.isPopupTrigger(), e.getButton()); } }; 右: SelectionInterval JList#setSelectionIntervalをオーバーライドしてひとつのアイテムのセルを選択した場合、JList#addSelectionInterval、JList#removeSelectionIntervalを使用するように変更 マウスでアイテム上をドラッグすると選択状態になる ひとつのアイテムのセル内でのドラッグでは、選択状態を変更しない Swing - Re: JList where mouse click acts like ctrl-mouse click JListの空白部分をクリックした場合、アイテムの選択状態をすべてクリア JListの選択を解除 参考リンク Swing - JList where mouse click acts like ctrl-mouse click JListの選択を解除 JListのセルにJCheckBoxを使用する JListのセルに項目選択チェックボックスを追加する コメント