2012-03-19 37 views
0

我有對象列表(Artikel.java),我將它們添加到JComboBox。 我想要這個對象的屬性(字符串名稱)在列表中?我做了如下但stil的對象是在列表中,它不可讀。將對象的屬性添加到組合框?

我該怎麼辦?我的問題在哪裏?

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()

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/)。 – 2012-03-19 13:02:44

回答

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

他已經在組合框中設置了自定義渲染器,它應該可以正常工作。很可能錯誤位於其他位置(如未發佈的代碼的某些部分)。重寫'toString'方法來修復UI問題並不是我會推薦的 – Robin 2012-03-19 13:01:37

+0

我同意你Robin。我只是建議這是一個適當的解決方案的起點 – 2012-03-19 13:11:50

+0

我得到了錯誤:線程中的異常「AWT-EventQueue-1」java.lang.ClassCastException:java.lang.String \t at be.azvub.j2eeoe。 util.configtoolscanners.control.ArtikelListRenderer.getListCellRendererComponent(TabbedPanChangeListener.java:235) ' – itro 2012-03-19 13:23:44

0

缺省列表單元格渲染器對未知類型的元素使用toString()。你可以在Artikel類中重載,但不建議使用。它會起作用,但是你會重載一個通用的方法來滿足你特定於Swing的目的。

正確的做法是給你自己執行ListCellRenderer(doc here)。

+0

我看過上面的代碼。在ArtikelListRenderer中出現類錯誤。 – itro 2012-03-19 13:26:27

+0

您確定只將類型爲Artikel的對象放入列表中嗎?發佈整個錯誤消息。 – 2012-03-19 14:13:16

+0

在異常線程 「AWT-EventQueue的-1」 java.lang.ClassCastException:java.lang.String中 \t在be.azvub.j2eeoe.util.configtoolscanners.control.ArtikelListRenderer.getListCellRendererComponent(TabbedPanChangeListener.java:234) \t在be.azvub.webutil.gui.wlaf.WebComboBoxUI.paintCurrentValue(WebComboBoxUI.java:130) \t在javax.swing.plaf.basic.BasicComboBoxUI.paint(BasicComboBoxUI.java:848) \t在javax.swing.plaf中。 ComponentUI.update(ComponentUI.java:142) \t at javax.swing.JComponent.paintComponent(JComponent.java:737) \t at javax.swing.JComponent.paint(JComponent.java:1000) – itro 2012-03-19 14:36:41