getListCellRendererComponent не вызывается с помощью JList‹String›

Я создал класс «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?

Заранее спасибо.


person Zach    schedule 22.04.2015    source источник


Ответы (1)


  • If you want to override a method, the parameters of the subclass-method have to be the same as those of the superclass. JList and JList<String> respectively Object and String are not of the same type, so the method of the subclass will not override the getListCellRendererComponent() method of the DefaultListCellRenderer.
    (Read here about overriding methods.)

  • If you want to avoid the warning, add a wildcard-symbol to the list type:
    JList<?>
    or add this before your method:
    @SuppressWarnings("rawtypes")

  • Если вы хотите получить элемент списка в виде строки, просто укажите параметр «значение», например:
    String s = (String) value;
person matthiasboesinger    schedule 03.12.2015