我有对象列表(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;
}
}
答案 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)的实施。