2012-03-19 7 views
0

私は以下のようにカスタムコンボボックスListCellRendererを持っています。JavaのJComboBoxのListCellRendererでクラスキャスト例外が発生するのはなぜですか?

class ArtikelListRenderer extends JLabel implements ListCellRenderer { 
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
     Artikel artikels = (Artikel) value; 
     setText(artikels.getName()); 
     return this; 
    } 
} 

このレンダリングを以下のようにコンボボックスに追加します。

public void setUpArtikelComboBox() { 
     panel.lstArtikel = readFromArtikel(); 
     panel.cbxArtikel = new WebComboBox(new ComboBoxModelArtikel(panel, lstArtikel)); 
     panel.cbxArtikel.setAction(new ComboBoxArtikelActionListener(panel)); 
     panel.cbxArtikel.setRenderer(new ArtikelListRenderer()); 
     panel.artikelTabPanel.add(panel.cbxArtikel, BorderLayout.NORTH); 
} 

は、なぜ私はラインでのListCellRendererクラスの

Exception in thread "AWT-EventQueue-1" java.lang.ClassCastException: java.lang.String 

を得るのです:

Artikel artikels = (Artikel) value; 
+2

として指定するものは何でもして呼び出されます(http://stackoverflow.com/questions/9770549/add-a-property-of-object-to-combo-box)[重複した質問を参照] – mKorbel

答えて

0

それは "値が" タイプArtikelではないことを意味します。

+0

でこの行 'panel.cbxArtikel = new WebComboBox(new ComboBoxModelArtikel(panel、lstArtikel));'私はcombiBoxにArtikelを追加します。そうですか? – itro

0

あなたのコンボボックスモデルにはStringが含まれているようです。

WebComboBoxとComboBoxModelArtikelのソースは何ですか?

編集:

  1. :私が(私はあなたの問題をシミュレートしたかった)期待通りに働いているように私には思える

    ...

    が3つの未回答の質問がありますなぜ独自のレンダリング(ArtikelListRenderer)を使用したいのですか?

  2. 独自のコンボボックス(WebComboBox)を使用する必要があるのはなぜですか?
  3. なぜあなたは同じ質問を複数回聞いていますか?(@ mKorbelのコメントを参照してください)
package net.betlista.swing; 

import java.awt.Component; 
import java.util.Arrays; 
import java.util.List; 

import javax.swing.ComboBoxModel; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JList; 
import javax.swing.ListCellRenderer; 
import javax.swing.event.ListDataListener; 

public class JComboBoxTest extends JFrame { 

    private JComboBox cb; 

    public JComboBoxTest() { 
     super("JComboBoxTest"); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     initGUI(); 

     this.pack(); 
     this.setVisible(true); 
    } 

    private void initGUI() { 
     initCB(); 
     this.add(cb); 
    } 

    private void initCB() { 
     final Person[] data = { new Person("A"), new Person("B") }; 
     final PersonComboBoxModel model = new PersonComboBoxModel(Arrays.asList(data)); 
     cb = new JComboBox(model); 

     cb.setRenderer(new PersonRenderer()); 
    } 

    class Person { 
     String name; 

     public Person(final String name) { 
      this.name = name; 
     } 

     @Override 
     public String toString() { 
      return name; 
     } 
    } 

    class PersonRenderer implements ListCellRenderer { 

     @Override 
     public Component getListCellRendererComponent(final JList list, final Object value, final int index, 
       final boolean isSelected, final boolean cellHasFocus) { 
      System.out.println("class: " + (value == null ? "" : value.getClass())); 
      return new JLabel(String.valueOf(value == null ? "" : value)); 
     } 
    } 

    class PersonComboBoxModel implements ComboBoxModel { 

     List<Person> list; 
     int selected = -1; 

     public PersonComboBoxModel(final List<Person> pl) { 
      list = pl; 
     } 

     @Override 
     public int getSize() { 
      return list.size(); 
     } 

     @Override 
     public Object getElementAt(final int index) { 
      return list.get(index); 
     } 

     @Override 
     public void addListDataListener(final ListDataListener l) { 
     } 

     @Override 
     public void removeListDataListener(final ListDataListener l) { 
     } 

     @Override 
     public void setSelectedItem(final Object anItem) { 
      list.indexOf(anItem); 
     } 

     @Override 
     public Object getSelectedItem() { 
      if (0 <= selected && selected < list.size()) return list.get(selected); 
      return null; 
     } 

    } 

    public static void main(final String[] args) { 
     new JComboBoxTest(); 
    } 

} 
+0

いいえ、パネルは 'Jpanel'、' lstArtikel'は 'List 'です。 – itro

+0

あなたの問題をシミュレートするために私の実装を追加しましたが、期待通りに機能するようです。上記の質問に答えてください。あなたが 'cb.setRenderer(new PersonRenderer());とコメントするとき、それは同じようにIMHOを動作させるからです。 – Betlista

+0

回答1 - comboBoxでオブジェクトを使用したいのですが、他にも文字列を追加できます。 回答2 - WebComboBoxは私が使用すべきフレームワークにあります。 回答3 - 私は夢中になり、私のコードは大丈夫だと分かっていたので。 最後にあなたのレクリエーションのおかげで、私は何が間違っているかを知る必要がありました。 – itro

1

私はComboBoxModelArtikelカスタムComboBoxModelであり、それはListまたは別のCollectionを使用していますと仮定します。

私も

panel.cbxArtikel = new WebComboBox(new ComboBoxModelArtikel(panel, lstArtikel)); 

を呼び出すときに正しく内部List(あなたのモデルを表したり、他のクラス)を初期化することを前提としています。

は、あなたのコード内のどこかに

JList.setPrototypeCellValue(Object prototypeCellValue) 

パラメータとしてStringを持っていますか?カスタムListCellRendererはあなたがprototypeCellValue

関連する問題