有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

swing为什么在java中JComboBox的ListCellRenderer上出现类强制转换异常?

我有一个自定义组合框列表,如下所示

class ArtikelListRenderer extends JLabel implements ListCellRenderer {
    public Component getListCellRendererComponent(JList list, Object value, int index,   boolean isSelected, boolean cellHasFocus) {
        Artikel artikels = (Artikel) value;
        setText(artikels.getName());
        return this;
    }
}

我将此渲染添加到组合框,如下所示

public void setUpArtikelComboBox() {
        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);
}

为什么我会受伤

Exception in thread "AWT-EventQueue-1" java.lang.ClassCastException: java.lang.String

在第行的ListCellRenderer类中:

Artikel artikels = (Artikel) value;

共 (3) 个答案

  1. # 1 楼答案

    我似乎您的组合框模型包含String

    WebComboBox和ComboBoxModelArtikel的来源是什么

    编辑:

    在我看来,它的工作正如我所期望的(我想模拟你的问题)

    有3个未回答的问题:

    1. 为什么要使用自己的渲染器(ArtikelListRenderer)
    2. 为什么需要使用自己的组合框(WebComboBox)
    3. 为什么你多次问同一个问题(见@mKorbel的评论)
    package net.betlista.swing;
    
    import java.awt.Component;
    import java.util.Arrays;
    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 JComboBoxTest extends JFrame {
    
        private JComboBox cb;
    
        public JComboBoxTest() {
            super( "JComboBoxTest" );
            this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    
            initGUI();
    
            this.pack();
            this.setVisible( true );
        }
    
        private void initGUI() {
            initCB();
            this.add( cb );
        }
    
        private void initCB() {
            final Person[] data = { new Person( "A" ), new Person( "B" ) };
            final PersonComboBoxModel model = new PersonComboBoxModel( Arrays.asList( data ) );
            cb = new JComboBox( model );
    
            cb.setRenderer( new PersonRenderer() );
        }
    
        class Person {
            String name;
    
            public Person(final String name) {
                this.name = name;
            }
    
            @Override
            public String toString() {
                return name;
            }
        }
    
        class PersonRenderer implements ListCellRenderer {
    
            @Override
            public Component getListCellRendererComponent( final JList list, final Object value, final int index,
                    final boolean isSelected, final boolean cellHasFocus ) {
                System.out.println( "class: " + ( value == null ? "" : value.getClass() ) );
                return new JLabel( String.valueOf( value == null ? "" : value ) );
            }
        }
    
        class PersonComboBoxModel implements ComboBoxModel {
    
            List<Person> list;
            int selected = -1;
    
            public PersonComboBoxModel(final List<Person> pl) {
                list = pl;
            }
    
            @Override
            public int getSize() {
                return list.size();
            }
    
            @Override
            public Object getElementAt( final int index ) {
                return list.get( index );
            }
    
            @Override
            public void addListDataListener( final ListDataListener l ) {
            }
    
            @Override
            public void removeListDataListener( final ListDataListener l ) {
            }
    
            @Override
            public void setSelectedItem( final Object anItem ) {
                list.indexOf( anItem );
            }
    
            @Override
            public Object getSelectedItem() {
                if ( 0 <= selected && selected < list.size() ) return list.get( selected );
                return null;
            }
    
        }
    
        public static void main( final String[] args ) {
            new JComboBoxTest();
        }
    
    }
    
  2. # 2 楼答案

    我假设ComboBoxModelArtikel是您的自定义ComboBoxModel,它使用一个List或另一个Collection

    我还假设打电话的时候

    panel.cbxArtikel = new WebComboBox(new ComboBoxModelArtikel(panel, lstArtikel));
    

    正确初始化内部List(或表示模型的其他类)

    你有电话吗

    JList.setPrototypeCellValue(Object prototypeCellValue)
    

    在代码中的某个地方使用String作为参数?您的自定义ListCellRenderer将被指定为prototypeCellValue的任何内容调用

  3. # 3 楼答案

    这意味着“值”不是Artikel类型