Я создал класс «MyJList», который расширяет JList. Я использую DefaultListModel и пользовательский модуль рендеринга ячеек под названием «MyListCellRenderer».
Вот простой пример, который хорошо работает:
public class MyJList extends JList<String>{
private DefaultListModel<String> myModel = new DefaultListModel<String>();
public MyJList(List<String> args){
this.setModel(myModel);
this.setCellRenderer(new MyListCellRenderer());
if(args.size() > 0)
for(String e : args)
myModel.addElement(e);
}
public class MyListCellRenderer extends DefaultListCellRenderer{
public Component getListCellRendererComponent(JList list, Object value, int index, boolean iss, boolean chf){
System.out.println("Function Called");
super.getListCellRendererComponent(list, value.toString(), index, iss, chf);
return this;
}
}
public static void main(String[] args){
JFrame f = new JFrame();
f.setSize(500, 500);
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
f.add(new MyJList(list));
f.setVisible(true);
}
}
Это работает хорошо. Метод getListCellRendererComponent вызывается для отображения ячеек (в выводе отображается несколько «вызываемых функций»). Однако у меня есть следующее предупреждение:
JList is a raw type. References to generic type JList<E> should be parametrized.
Думаю, лучше указать тип объектов в JList, поэтому я изменяю следующую строку:
public Component getListCellRendererComponent(JList<String> list, String value, int index, boolean iss, boolean chf){
Проблема в том, что с этой модификацией метод getListCellRendererComponent больше не вызывается (в выводе нет «Вызванная функция»).
Я не понимаю, почему. Это нормально? Если это так, знаете ли вы, как я могу указать, что список содержит String, но, тем не менее, должен вызываться getListCellRendererComponent?
Заранее спасибо.