2016-03-21 10 views
1

GenericListCellRendererでスイッチコンポーネントを設定しようとしていますが、内部アプリケーションエラー - NullPointer Exceptionとしてエラーをスローします。リスト内にクリック可能なコンポーネントが含まれているGenericListCellRenderer

コード私は以下のように試しました。

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; 
    } 
+0

あなたは、配列の代わりに、より良い利用のArrayList [] –

答えて

0

リストはラバースタンプアプローチで動作するため、参照しているコンポーネントはもう存在しません。クリックは常にListになるので、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); 
      } 
     } 
    }); 
+0

。このトリックは私のために働いています。しかし、問題は、 "OnOffSwitch"の代わりにCheckBoxを入れてリストをクリックすると、チェックボックスが選択されていることです。私はチェックボックスだけをクリックするときにそれを選択したい。 – Sweety

+0

これは暗黙的に行う 'GenericListCellRenderer'の動作です。また、チェックボックスをモデルにマップします。おそらくこのようなものを手に入れることができますが、私は**このリストやレンダラーを使わないことを強くお勧めします**。 –

関連する問題