【问题标题】:add a property of object to combo box?将对象的属性添加到组合框?
【发布时间】:2012-03-19 12:52:10
【问题描述】:

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

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;
    }
 }

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE

标签: java swing list combobox


【解决方案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 中

【讨论】:

  • 他已经在组合框上设置了一个自定义渲染器,应该可以正常工作。错误很可能位于其他地方(如未发布的代码的某些部分)。重写 toString 方法来修复 UI 问题不是我推荐的方法
  • 我同意你的观点,罗宾。我只是建议将此作为寻求适当解决方案的起点
  • 我弄错了:Exception in thread "AWT-EventQueue-1" java.lang.ClassCastException: java.lang.String at be.azvub.j2eeoe.util.configtoolscanners.control.ArtikelListRenderer.getListCellRendererComponent(TabbedPanChangeListener.java:235)
  • 我编辑了答案。我把所有东西都放在一个班级里,而且似乎很管用。可以看看吗?
  • 谢谢它的工作。我确实在我的模型中留下了一行代码,它返回字符串而不是 Artikel,这是一个问题。你的娱乐帮助了我。非常感谢。
【解决方案2】:

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

正确的做法是提供您自己的ListCellRenderer(doc here 实现。

【讨论】:

  • 我确实看到了上面的代码。我在ArtikelListRenderer 中收到错误作为类转换异常。
  • 您确定只将 Artikel 类型的对象放入列表中吗?发布整个错误消息。
  • 线程“AWT-EventQueue-1”中的异常 java.lang.ClassCastException: java.lang.String at be.azvub.j2eeoe.util.configtoolscanners.control.ArtikelListRenderer.getListCellRendererComponent(TabbedPanChangeListener.java: 234) 在 be.azvub.webutil.gui.wlaf.WebComboBoxUI.paintCurrentValue(WebComboBoxUI.java:130) 在 javax.swing.plaf.basic.BasicComboBoxUI.paint(BasicComboBoxUI.java:848) 在 javax.swing.plaf.ComponentUI .update(ComponentUI.java:142) 在 javax.swing.JComponent.paintComponent(JComponent.java:737) 在 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) at javax.swing.JComponent.paint(JComponent.java:1009) at javax.swing.JComponent.paintChildren(JComponent.java:837) at javax.swing.JComponent.paint(JComponent.java:1009) at 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.java:1009)
  • 在 javax.swing.JLayeredPane.paint(JLayeredPane.java:559) 在 javax.swing.JComponent.paintChildren(JComponent.java:837) 在 javax.swing.JComponent.paint(JComponent.java :1009) 在 javax.swing.JComponent._paintImmediately(JComponent.java:4862) 在 javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4919) 在 javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4966) 在 javax .swing.JComponent.paintImmediately(JComponent.java:4669) 在 javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:451) 在
猜你喜欢
  • 2017-05-25
  • 2021-03-22
  • 1970-01-01
  • 2016-10-31
  • 2020-08-09
  • 2015-11-15
  • 1970-01-01
  • 2015-09-21
相关资源
最近更新 更多