列表中包含可点击组件的 GenericListCellRenderer 不起作用
GenericListCellRenderer with clickable component included in list not working
我正在尝试在 GenericListCellRenderer 上设置开关组件,但它抛出错误作为内部应用程序错误 - NullPointer 异常。
我试过的代码如下。
Form hi = new Form("Hi World");
hi.setLayout(new BorderLayout());
com.codename1.ui.List list = new com.codename1.ui.List(createGenericListCellRendererModelData());
list.setRenderer(new GenericListCellRenderer(createGenericRendererContainer(), createGenericRendererContainer()));
Button b = ((GenericListCellRenderer)list.getRenderer()).extractLastClickedComponent();
System.out.println("button >> " +b);
if(b != null) {
System.out.println("button");
// handle button click event and return
Dialog.show("test", "test", "OK", null);
return;
}
list.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
// TODO Auto-generated method stub
Dialog.show("hello", "test", "OK", null);
}
});
hi.add(BorderLayout.CENTER,list);
hi.show();
private Container createGenericRendererContainer() {
Label name = new Label();
name.setFocusable(true);
name.setName("Name");
Label surname = new Label();
surname.setFocusable(true);
surname.setName("Surname");
OnOffSwitch selected = new OnOffSwitch();
selected.setName("Selected");
selected.setFocusable(true);
selected.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
// TODO Auto-generated method stub
Dialog.show("switch", "switch", "OK", null);
}
});
Container c = new Container(new BorderLayout());
c.setUIID("ListRenderer");
Container cc = new Container(new GridLayout(1, 4)) ;
cc.add(new Label("test1")).add(new Label("test2")).add(new Label("test3")).add(new Label("test4"));
c.add(BorderLayout.WEST,selected);
c.add(BorderLayout.CENTER, cc);
return c;
}
private Object[] createGenericListCellRendererModelData() {
Map<String,Object>[] data = new HashMap[5];
data[0] = new HashMap<String, Object>();
data[0].put("Name", "Shai");
data[0].put("Surname", "Almog");
data[0].put("Selected", Boolean.TRUE);
data[1] = new HashMap<String, Object>();;
data[1].put("Name", "Chen");
data[1].put("Surname", "Fishbein");
data[1].put("Selected", Boolean.TRUE);
data[2] = new HashMap<String, Object>();
data[2].put("Name", "Ofir");
data[2].put("Surname", "Leitner");
data[3] = new HashMap<String, Object>();
data[3].put("Name", "Yaniv");
data[3].put("Surname", "Vakarat");
data[4] = new HashMap<String, Object>();
data[4].put("Name", "Meirav");
data[4].put("Surname", "Nachmanovitch");
return data;
}
由于列表使用橡皮图章方法,因此您所指的组件已不存在。你只需要听 List events since a click will always be on the List.
解决方案是使用 extractLastClickedComponent()
从 GenericListCellRenderer 中获取最后单击的组件。
例如:
list.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
GenericListCellRenderer gn = (GenericListCellRenderer)list.getRenderer();
Component lastCmp = gn.extractLastClickedComponent();
if(lastCmp != null) {
Dialog.show("hello", "Clicked: " + lastCmp.getName(), "OK", null);
} else {
Dialog.show("hello", "test", "OK", null);
}
}
});
我正在尝试在 GenericListCellRenderer 上设置开关组件,但它抛出错误作为内部应用程序错误 - NullPointer 异常。
我试过的代码如下。
Form hi = new Form("Hi World");
hi.setLayout(new BorderLayout());
com.codename1.ui.List list = new com.codename1.ui.List(createGenericListCellRendererModelData());
list.setRenderer(new GenericListCellRenderer(createGenericRendererContainer(), createGenericRendererContainer()));
Button b = ((GenericListCellRenderer)list.getRenderer()).extractLastClickedComponent();
System.out.println("button >> " +b);
if(b != null) {
System.out.println("button");
// handle button click event and return
Dialog.show("test", "test", "OK", null);
return;
}
list.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
// TODO Auto-generated method stub
Dialog.show("hello", "test", "OK", null);
}
});
hi.add(BorderLayout.CENTER,list);
hi.show();
private Container createGenericRendererContainer() {
Label name = new Label();
name.setFocusable(true);
name.setName("Name");
Label surname = new Label();
surname.setFocusable(true);
surname.setName("Surname");
OnOffSwitch selected = new OnOffSwitch();
selected.setName("Selected");
selected.setFocusable(true);
selected.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
// TODO Auto-generated method stub
Dialog.show("switch", "switch", "OK", null);
}
});
Container c = new Container(new BorderLayout());
c.setUIID("ListRenderer");
Container cc = new Container(new GridLayout(1, 4)) ;
cc.add(new Label("test1")).add(new Label("test2")).add(new Label("test3")).add(new Label("test4"));
c.add(BorderLayout.WEST,selected);
c.add(BorderLayout.CENTER, cc);
return c;
}
private Object[] createGenericListCellRendererModelData() {
Map<String,Object>[] data = new HashMap[5];
data[0] = new HashMap<String, Object>();
data[0].put("Name", "Shai");
data[0].put("Surname", "Almog");
data[0].put("Selected", Boolean.TRUE);
data[1] = new HashMap<String, Object>();;
data[1].put("Name", "Chen");
data[1].put("Surname", "Fishbein");
data[1].put("Selected", Boolean.TRUE);
data[2] = new HashMap<String, Object>();
data[2].put("Name", "Ofir");
data[2].put("Surname", "Leitner");
data[3] = new HashMap<String, Object>();
data[3].put("Name", "Yaniv");
data[3].put("Surname", "Vakarat");
data[4] = new HashMap<String, Object>();
data[4].put("Name", "Meirav");
data[4].put("Surname", "Nachmanovitch");
return data;
}
由于列表使用橡皮图章方法,因此您所指的组件已不存在。你只需要听 List events since a click will always be on the List.
解决方案是使用 extractLastClickedComponent()
从 GenericListCellRenderer 中获取最后单击的组件。
例如:
list.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
GenericListCellRenderer gn = (GenericListCellRenderer)list.getRenderer();
Component lastCmp = gn.extractLastClickedComponent();
if(lastCmp != null) {
Dialog.show("hello", "Clicked: " + lastCmp.getName(), "OK", null);
} else {
Dialog.show("hello", "test", "OK", null);
}
}
});