2012-03-19 11 views
0

私はオブジェクト(Artikel.java)のリストを持っており、それらをJComboBoxに追加します。 このオブジェクトのプロパティ(文字列名)をリストに入れたいですか?私は以下のようにしましたが、オブジェクトがリストにあり、読むことができません。オブジェクトのプロパティをコンボボックスに追加しますか?

どうすればいいですか?私の問題はどこですか?

if (titel.equalsIgnoreCase("artikel")) { 
      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); 

} 

ComboBoxModelArtikel

public class ComboBoxModelArtikel implements ComboBoxModel{ 
ConfigToolScannersPanel panel; List<Artikel> lstArtikels; 
private Object selectedItem; 

public ComboBoxModelArtikel(ConfigToolScannersPanel panel, List<Artikel> artikels) { 
    this.panel=panel; this.lstArtikels=artikels;  
     } 
public void setSelectedItem(Object anItem) { 
    selectedItem=anItem; 
     } 
public Object getSelectedItem() { 
    return selectedItem; 
     } 
public int getSize() { 
    return lstArtikels.size(); 
     } 
public Object getElementAt(int index) { 
    return (Artikel)lstArtikels.get(index); 
     } 
public void addListDataListener(ListDataListener l) { 
    //Todo: 
     } 
public void removeListDataListener(ListDataListener l) { 
    //Todo: 
     } 
    } 

ArtikelListRenderer()私は1つのクラスで問題を再現し、それが動作しているようだ

class ArtikelListRenderer extends JLabel implements ListCellRenderer { 
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
    if (value != null) { 
     Artikel artikels = (Artikel) value; 
     setText(artikels.getName()); 
    } else{ 
     setText("Please select an item"); 
    } 

    return this; 
    } 
} 
+0

すぐに役立つように、[SSCCE](http://sscce.org/)を投稿してください。 –

答えて

1

package test; 

import java.awt.Component; 
import java.awt.Dimension; 
import java.util.ArrayList; 
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 ComboMain { 

    public static void main(String[] args) { 
     JFrame f = new JFrame(); 
     JComboBox<Artikel> cmb = new JComboBox<Artikel>(
       new ComboBoxModelArtikel(null, readFromArtikel())); 
     cmb.setRenderer(new ArtikelListRenderer()); 
     f.add(cmb); 
     f.setSize(new Dimension(200, 200)); 
     f.setVisible(true); 
    } 

    public static List<Artikel> readFromArtikel() { 
     List<Artikel> a = new ArrayList<Artikel>(); 
     a.add(new Artikel("id", "name")); 
     a.add(new Artikel("id1", "name1")); 
     return a; 
    } 

} 

class Artikel { 
    String id; 
    String name; 

    public Artikel(String id, String name) { 
     this.id = id; 
     this.name = name; 
    } 

    public String getName() { 
     return this.name; 
    } 

} 


class ArtikelListRenderer extends JLabel implements ListCellRenderer<Artikel> { 

    @Override 
    public Component getListCellRendererComponent(
      JList<? extends Artikel> list, Artikel value, int index, 
      boolean isSelected, boolean cellHasFocus) { 
     if (value != null) { 
      Artikel artikels = (Artikel) value; 
      setText(artikels.getName()); 
     } else { 
      setText("Please select an item"); 
     } 

     return this; 
    } 
} 

class ComboBoxModelArtikel implements ComboBoxModel<Artikel> { 
    private Object selectedItem; 
    List<Artikel> lstArtikels; 
    private Object panel; 

    public ComboBoxModelArtikel(Object panel, List<Artikel> artikels) { 
     this.panel = panel; 
     this.lstArtikels = artikels; 
    } 

    public void setSelectedItem(Object anItem) { 
     selectedItem = anItem; 
    } 

    public Object getSelectedItem() { 
     return selectedItem; 
    } 

    public int getSize() { 
     return lstArtikels.size(); 
    } 

    public Artikel getElementAt(int index) { 
     return lstArtikels.get(index); 
    } 

    public void addListDataListener(ListDataListener l) { 
     // Todo: 
    } 

    public void removeListDataListener(ListDataListener l) { 
     // Todo: 
    } 
} 

WebComboBoxに問題がある可能性があります。そのソースを共有できますか?

+3

彼はすでにコンボボックスに設定されているカスタムレンダラを持っています。これはうまくいくはずです。ほとんどの場合、エラーは他の場所に配置されている可能性があります(ポストされていないコードの一部)。 UIの問題を解決するための 'toString'メソッドをオーバーライドすることは、私が今まで勧めていたものではありません。 – Robin

+0

私はRobinに同意します。私はこれを適切な解決策に向かって出発点として提案しました。 –

+0

erro:例外「スレッドAWT-EventQueue-1」例外:java.lang.ClassCastException:java.lang.String \t be.azvub.j2eeoe。 util.configtoolscanners.control.ArtikelListRenderer.getListCellRendererComponent(TabbedPanChangeListener.java:235) ' – itro

0

デフォルトのリストセルレンダラーは、未知の型の要素に対してtoString()を使用します。 Artikelクラスでそれをオーバーロードすることができますが、はお勧めしませんです。それは動作しますが、Swing固有の目的に合わせて汎用メソッドをオーバーロードします。

正しい方法は、ListCellRenderer(doc hereという独自の実装を提供することです。

+0

私は上記のコードを見ました。 'ArtikelListRenderer'でクラスキャストの例外としてエラーが発生します。 – itro

+0

Artikel型のオブジェクトだけをリストに入れていますか?エラーメッセージ全体を投稿してください。 –

+0

スレッドの例外 "AWT-EventQueueの-1" にjava.lang.ClassCastException:be.azvub.j2eeoe.util.configtoolscanners.control.ArtikelListRenderer.getListCellRendererComponentで \tをjava.lang.Stringで(TabbedPanChangeListener.java:234) \tでbe.azvub.webutil.gui.wlaf.WebComboBoxUI.paintCurrentValue(WebComboBoxUI.java:130)javax.swing.plafので javax.swing.plaf.basic.BasicComboBoxUI.paintで\t(BasicComboBoxUI.java:848) \t。 ComponentUI.update(ComponentUI.java:142)javax.swing.JComponent.paintComponent(JComponent.java:737)で \t javax.swing.JComponent.paint(JComponent.java:1000)するjavax.swingにおける – itro

関連する問題