Почему я получаю исключение приведения класса на ListCellRenderer JComboBox в Java? - PullRequest
0 голосов
/ 19 марта 2012

У меня есть пользовательское поле со списком 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 голос
/ 05 сентября 2012

Я полагаю, ComboBoxModelArtikel - ваш пользовательский ComboBoxModel, и он использует List или другой Collection.

. Я также предполагаю, что при вызове

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

вы правильноинициализируйте внутренний List (или другой класс, представляющий вашу модель).

Есть ли у вас

JList.setPrototypeCellValue(Object prototypeCellValue)

где-то в вашем коде и String в качестве параметра?Ваш пользовательский ListCellRenderer вызывается с тем, что вы указали как prototypeCellValue

0 голосов
/ 19 марта 2012

Мне кажется, что ваша модель со списком содержит 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();
    }

}
0 голосов
/ 19 марта 2012

Это означает, что «значение» не относится к типу Artikel.

...