Templates 未使用JList调用GetListCellRenderComponent<;字符串>;

Templates 未使用JList调用GetListCellRenderComponent<;字符串>;,templates,jlist,listcellrenderer,Templates,Jlist,Listcellrenderer,我创建了一个类“MyJList”,它扩展了JList。我使用一个DefaultListModel和一个名为“MyListCellRenderer”的自定义单元格渲染器 下面是一个简单的例子,效果很好: public class MyJList extends JList<String>{ private DefaultListModel<String> myModel = new DefaultListModel<String>(); pu

我创建了一个类“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);
    }
}
公共类MyJList扩展JList{
private DefaultListModel myModel=新的DefaultListModel();
公共MyJList(列表参数){
这个.setModel(myModel);
这个.setCellRenderer(新的MyListCellRenderer());
如果(args.size()>0)
for(字符串e:args)
myModel.addElement(e);
}
公共类MyListCellRenderer扩展了DefaultListCellRenderer{
公共组件getListCellRenderComponent(JList、对象值、int索引、布尔iss、布尔chf){
System.out.println(“调用的函数”);
super.getListCellRenderComponent(list,value.toString(),index,iss,chf);
归还这个;
}
}
公共静态void main(字符串[]args){
JFrame f=新的JFrame();
f、 设置大小(500500);
列表=新的ArrayList();
列表。添加(“a”);
列表。添加(“b”);
f、 增加(新的MyJList(列表));
f、 setVisible(真);
}
}
它工作得很好。调用getListCellRenderComponent方法来显示单元格(输出中显示几个“函数调用”)。然而,我有以下警告:

JList is a raw type. References to generic type JList<E> should be parametrized. 
JList是原始类型。对泛型类型JList的引用应参数化。
我想最好在JList中指定对象的类型,因此我修改了以下行:

        public Component getListCellRendererComponent(JList<String> list, String value, int index, boolean iss, boolean chf){  
public组件getListCellRenderComponent(JList列表、字符串值、int索引、布尔iss、布尔chf){
问题在于,通过这种修改,方法getListCellRenderComponent不再被调用(输出中没有“调用函数”)

我不明白为什么。这正常吗?如果是,您知道我如何指定列表包含字符串,但必须调用GetListCellRenderComponent吗

提前感谢。

  • 如果要重写方法,子类方法的参数必须与超类的参数相同。
    JList
    JList
    分别
    Object
    String
    的类型不同,因此子类的方法不会重写
    getListCellRenderComponent()
    DefaultListCellRenderer的方法
    (阅读有关重写方法的内容。)
  • 如果要避免出现警告,请在列表中添加通配符 键入:
    JList

    或将此添加到方法之前:
    @SuppressWarnings(“rawtypes”)
  • 如果要将列表项作为字符串获取,只需强制转换“value”参数,如:
    string s=(string)value;