Templates 未使用JList调用GetListCellRenderComponent<;字符串>;
我创建了一个类“MyJList”,它扩展了JList。我使用一个DefaultListModel和一个名为“MyListCellRenderer”的自定义单元格渲染器 下面是一个简单的例子,效果很好: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
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
DefaultListCellRenderer的方法getListCellRenderComponent()
(阅读有关重写方法的内容。) - 如果要避免出现警告,请在列表中添加通配符
键入:
JList
或将此添加到方法之前:@SuppressWarnings(“rawtypes”)
- 如果要将列表项作为字符串获取,只需强制转换“value”参数,如:
string s=(string)value;