2016-03-16 9 views
0

Я хотел бы создать свой собственный метод, который будет работать, когда компонент «isSelected».Метод переопределения, который переключает «isSelected» в getListCellRendererComponent

У меня есть 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 
+0

1. У меня есть JList, содержащий несколько JPanel. == JList (его XxxListModel) не предназначен для хранения JComponent, не помещайте JComponent в JList (его XxxListModel), 2. внутри ListSelectionModel вы можете переключаться или переопределяться программно, 3. для причины, по которой есть MouseListener, использовать ListSelectionListener, прочитать учебник Oracle для примера рабочего кода – mKorbel

+0

для лучшей помощи, прежде чем опубликовать SSCCE/MCVE, короткий, выполнимый, компилируемый – mKorbel

+0

@mKorbel - I использовал JComponets для рендеринга элементов в моем списке. Я предполагал, что должен быть какой-то способ переопределить код, который выполняется, когда я нажимаю элемент в списке. –

ответ

0

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

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

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

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

JList - deselect when clicking an already selected item

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

Тогда я мог бы добавить boolean 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()); 
}