添加对象的属性到组合框?

时间:2012-03-19 12:52:10

标签: java swing list combobox

我有对象列表(Artikel.java),我将它们添加到JComboBox。 我想要这个对象的属性(String name)在列表中?我做了如下,但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;
    }
 }

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

默认列表单元格渲染器对未知类型的元素使用toString()。您可以在Artikel类中重载,但不推荐。它会工作,但你会超载一个通用的方法,以适应你的Swing特定的目的。

正确的做法是为您提供ListCellRenderer (doc here)的实施。