Java 是否将对象的属性添加到组合框?

Java 是否将对象的属性添加到组合框?,java,swing,list,combobox,Java,Swing,List,Combobox,我有一个对象列表(Artikel.java),并将它们添加到JComboBox中。 我希望列表中包含此对象的属性(字符串名称)?我做了如下操作,但该对象仍在列表中,不可读 我该怎么做?我的问题在哪里? if (titel.equalsIgnoreCase("artikel")) { panel.lstArtikel = readFromArtikel(); panel.cbxArtikel = new WebComboBox(new ComboBo

我有一个对象列表(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:
      }
    }

我在一节课上重新创建了这个问题,它似乎起了作用:

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:
    }
}
封装测试;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.ComboxModel;
导入javax.swing.JComboBox;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JList;
导入javax.swing.ListCellRenderer;
导入javax.swing.event.ListDataListener;
公共类ComboMain{
公共静态void main(字符串[]args){
JFrame f=新的JFrame();
JCOMBOX cmb=新JCOMBOX(
新的ComboBoxModelArtikel(null,readFromArtikel());
cmb.setRenderer(新ArtikelListRenderer());
f、 增补(中巴);
f、 设置尺寸(新尺寸(200200));
f、 setVisible(真);
}
公共静态列表readFromArtikel(){
列表a=新的ArrayList();
a、 添加(新的Artikel(“id”、“名称”);
a、 添加(新的Artikel(“id1”、“名称1”);
返回a;
}
}
Artikel类{
字符串id;
字符串名;
公共Artikel(字符串id、字符串名称){
this.id=id;
this.name=名称;
}
公共字符串getName(){
返回此.name;
}
}
类ArtikelListRenderer扩展了JLabel实现ListCellRenderer{
@凌驾
公共组件GetListCellRenderComponent(

JList默认列表单元格呈现程序对未知类型的元素使用toString()。您可以在Artikel类中重载它,但不建议使用它。。它可以工作,但您将重载一个通用方法以满足特定于Swing的目的


正确的方法是为您提供自己的
ListCellRenderer
)实现。

他已经在combobox上设置了一个自定义的呈现程序,它应该可以正常工作。错误很可能位于其他地方(如未发布的代码部分)。重写
toString
方法来修复UI问题并不是我会推荐的做法。我同意你的看法,Robin。我只是建议将此作为迈向正确解决方案的起点。我在线程“AWT-EventQueue-1”中遇到错误:
异常java.lang.ClassCastException:java.lang.String位于be.azvub.j2eeoe.util.configtoolscanners.control.ArtikelListRenderer.GetListCellRenderComponent(TabbedPanChangeListener.java:235)
我编辑了答案。我把所有的答案都放在一个类中,看起来很有效。你能看一下吗?谢谢,它很有效。我确实在模型的代码行上留下了字符串,它返回了字符串而不是Artikel,这是一个问题。你的娱乐帮助了我。非常感谢。为了更快地获得更好的帮助,请发布一条。我确实看到了上面的代码。我在
Ar中遇到了错误tikelListRenderer
作为类强制转换的execption。您确定只在列表中放置Artikel类型的对象吗?发布整个错误消息。线程“AWT-EventQueue-1”java.lang.ClassCastException中出现异常:java.lang.String位于be.azvub.j2eeoe.util.configtoolscanners.control.ArtikelListRenderer.GetListCellRenderer组件位于javax.swing.plaf.basic.BasicComboBoxUI.paint(JComponent.java:737)的be.azvub.webutil.gui.wlaf.WebComboBoxUI.paintCurrentValue(WebComboBoxUI.java:130)处javax.swing.JComponent.paint(JComponent.java:1000)javax.swing.JComponent.paintChildren(JComponent.java:837)javax.swing.JComponent.paint(JComponent.java:1009)javax.swing.JComponent.paintChildren(JComponent.java:837)javax.swing.JComponent.JComponent.paintchildrent(JComponent.java:1009)javax.swing.JComponent.JComponent.java:837javax.swing.JComponent.paint(JComponent.java:1009)javax.swing.JComponent.paintChildren(JComponent.java:837)javax.swing.JComponent.paint(JComponent.java:1009)javax.swing.JComponent.paintChildren(JComponent.java:837)javax.swing.JLayeredPane.paint(JLayeredPane.java:559)javax.swing.JComponent.JComponent.JComponent.java:1009javax.swing.JComponent.paintChildren(JComponent.java:837)javax.swing.JComponent.paint(JComponent.java:1009)javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4966)javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4919)javax.swing.JComponent.JComponent在javax.swing.JComponent.paintInstance(JComponent.java:4669)在javax.swing.repainmanager.paintDirtyRegions(repainmanager.java:451)在
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:
    }
}