0

我创建了一个扩展 JList 的类“MyJList”。我使用 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 吗?

提前致谢。

4

1 回答 1

0
  • 如果要覆盖方法,子类方法的参数必须与超类的参数相同。JListJList<String>分别Object和不是同一类型,所以子类的方法String不会覆盖. (在此处阅读有关覆盖方法的信息。)getListCellRendererComponent()DefaultListCellRenderer

  • 如果您想避免警告,请在列表类型中添加通配符符号:
    JList<?>
    或在您的方法之前添加:
    @SuppressWarnings("rawtypes")

  • 如果您想将列表项作为字符串获取,只需转换“值”参数,例如:
    String s = (String) value;
于 2015-12-03T02:21:37.583 回答