Заставить JList вести себя на клике так же, как на Ctrl + клик? - PullRequest
2 голосов
/ 01 ноября 2011

Я ищу способ, чтобы JList всегда переключал выбор для выбранного элемента без отмены выбора других, так же, как ctrl click работает.

ListSelectionModel, кажется, правильный путь, но я не могу понять, что там должно быть настроено.

Как заставить JList вести себя на клик так же, как на ctrl клик ?

Ответы [ 3 ]

5 голосов
/ 01 ноября 2011

Вы можете использовать следующее ListSelectionModel:

list.setSelectionModel(new DefaultListSelectionModel(){
    @Override
    public void setSelectionInterval(int start, int end) {
        if (start != end) {
            super.setSelectionInterval(start, end);
        } else if (isSelectedIndex(start)) {
            removeSelectionInterval(start, end);
        } else {
            addSelectionInterval(start, end);
        }
    }
});
4 голосов
/ 01 ноября 2011

Вы должны сделать свой собственный ListSelectionModel. попытайся.

list.setSelectionModel(new DefaultListSelectionModel() 
{
    @Override
    public void setSelectionInterval(int index0, int index1) 
    {
        if(list.isSelectedIndex(index0)) 
        {
            list.removeSelectionInterval(index0, index1);
        }
        else 
        {
            list.addSelectionInterval(index0, index1);
        }
    }
});
2 голосов
/ 01 ноября 2011

возможно, этот код может сделать это правильно

import java.awt.Component;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import javax.swing.*;

public class Ctrl_Down_JList {

    private static void createAndShowUI() {
        String[] items = {"Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat"};
        JList myJList = new JList(items) {

            private static final long serialVersionUID = 1L;

            @Override
            protected void processMouseEvent(MouseEvent e) {
                int modifiers = e.getModifiers() | InputEvent.CTRL_MASK;
                // change the modifiers to believe that control key is down
                int modifiersEx = e.getModifiersEx() | InputEvent.CTRL_MASK;
                // can I use this anywhere?  I don't see how to change the modifiersEx of the MouseEvent
                MouseEvent myME = new MouseEvent((Component) e.getSource(), e.getID(), e.getWhen(), modifiers, e.getX(),
                        e.getY(), e.getXOnScreen(), e.getYOnScreen(), e.getClickCount(), e.isPopupTrigger(), e.getButton());
                super.processMouseEvent(myME);
            }
        };
        JFrame frame = new JFrame("Ctrl_Down_JList");
        frame.add(new JScrollPane(myJList));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowUI();
            }
        });
    }
...