Метод переопределения, который переключает 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());
}