Java 是否将对象的属性添加到组合框?
我有一个对象列表(Artikel.java),并将它们添加到JComboBox中。 我希望列表中包含此对象的属性(字符串名称)?我做了如下操作,但该对象仍在列表中,不可读 我该怎么做?我的问题在哪里?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
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:
}
}