Метод переопределения, который переключает isSelected в getListCellRendererComponent

Я хотел бы сделать свой собственный метод, который контролирует, когда компонент isSelected.

у меня есть JList содержащий несколько JPanel, Класс конструирования JPanel extends ListCellRenderer<>,

Чтобы показать, что выбран один из компонентов JList (JPanels), я использую;

@Override
public Component getListCellRendererComponent(..., boolean isSelected, ...) {
    if(isSelected){
        setBackground(list.getSelectionBackground());
        setForeground(list.getSelectionForeground());
    } else {
        setBackground(list.getBackground());
        setForeground(list.getForeground());
    }
    return this;
}

Я хотел бы, чтобы метод оставлял выбранный элемент "выбранным", хотя я выбираю другой. Я понимаю, что это можно сделать, удерживая клавишу CTRL, но .setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); не совсем делает свое дело. Я бы предпочел выбрать несколько, нажав на них, и отменить выбор, нажав на них.

Для этого я работал с ListSelectionMode, но я не могу найти способ.

После выполнения вышеизложенного я хотел бы реализовать метод, который выбирает компонент в списке только при щелчке в определенной области (вместо всего предустановленного компонента). Я сделал этот метод, который возвращает true, если щелкнуть нужную область, иначе false. Но так как я не могу понять, как переопределить событие мыши, которое делает компоненты 'isSelected', это было сложно.

Вот код для метода, который я хотел бы переопределить методом isSelected;

this.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent evt) {
            if(ActionHandler.mouseClickedPrebuild(evt.getPoint())){
                //This code runs if that special place is clicked!
                //So now the component should be 'isSelected' or
                //deselected if it already was 'isSelected'.
            }
        }
    });

Этот код находится в конструкторе моего JList

И mouseClickedPrebuild Способ;

public static boolean mouseClickedPrebuild(Point point) {
        int index = theJList.locationToIndex(point);
        Rectangle bounds = theJList.getCellBounds(index,index);
        Point p = bounds.getLocation();
        return ( ... long list of greater than & less than ...);
        //This gives the certain area which is accepted to return true

1 ответ

Решение

Я решил проблему!

Таким образом, я получаю свое представление, показывая эту строку;

// UI Class   JScrollPane               Custom JList
UIConstructor.listview.setViewportView(new ListView( -insert ArrayList here- ));

Вот мой ListView. Пользовательский DefaultListSelectionModel, который я использовал для решения своей проблемы, был размещен @FuryComptuers прямо здесь;

JList - отменить выбор при нажатии на уже выбранный элемент

Мне пришлось внести несколько изменений в код, так как два метода в selectionModel будет работать до моего мышиного события. Я сохранил переменные статически, поэтому вместо запуска кода в setSelectionInterval Я сделал это внутри mousePressed,

Затем я мог бы добавить логическое значение isSelected которая возвращает true, если щелкнуть область занавеса в пределах определенного элемента списка.

public class ListViewd extends JList {

static boolean isSelected;
static Point point;

static boolean gS = false;
static int in0;
static int in1;

@Override
public Dimension getPreferredScrollableViewportSize() {
    Dimension size = super.getPreferredScrollableViewportSize();
    size.setSize(new Dimension(0,0));
    return size;
}

public ListView(ArrayList<System> items) {

    DefaultListModel<System> list = new DefaultListModel<System>();

    for (System item : items) {
        list.addElement(item);
    }

    this.setSelectionModel(new DefaultListSelectionModel() {

        boolean gestureStarted = false;

        @Override
        public void setSelectionInterval(int index0, int index1) {
            gS = gestureStarted;
            in0 = index0;
            in1 = index1;

            gestureStarted = true;
        }

        @Override
        public void setValueIsAdjusting(boolean isAdjusting) {
            if (!isAdjusting) {
                gestureStarted = false;
            }
        }

    });

    ListSelectionModel selectionModel = this.getSelectionModel();

    addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            point = e.getPoint();
            isSelected = ActionHandler.mouseClickedPrebuild(point);

            if(!gS && isSelected){
                if (isSelectedIndex(in0)) {
                    selectionModel.removeSelectionInterval(in0, in1);
                } else {
                    selectionModel.addSelectionInterval(in0, in1);
                }
            }
        }
    });

    setModel(list);
    setCellRenderer(new ListModelPrebuild());
}
Другие вопросы по тегам