2012-04-29 7 views
5

Quando chiamo JList<String>.getModel() e lo getto a DefaultListModel<String> mi dà questa eccezione.JList.getModel() ClassCastException

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JList$4 cannot be cast to javax.swing.DefaultListModel 

Il codice che getta:

private JList<String> list = new JList<String>(); 
((DefaultListModel<String>) list.getModel()).addElement(...); 

E non lo fa ogni volta però. La maggior parte delle volte funziona perfettamente, ma altre volte getta questa eccezione. Non capisco perché questo sta accadendo. C'è qualcosa che posso fare per evitare che ciò accada?

+1

Per una migliore aiuto prima, inviare un [SSCCE] (http://sscce.org/). –

+0

Per quale motivo ho pensato che la domanda fosse ragionevole e completa, anche se questo potrebbe essere dovuto alle modifiche di Andrew. – ditkin

+1

@ditkin Non posso nemmeno dire cosa ha modificato Andrew. Ma ho trovato il problema, si trattava del metodo 'setListData (E [])' ha cambiato il 'ListModel' dell'elenco. – Stripies

risposta

5

Non si deve presumere che sia un DefaultListModel. Utilizzare l'interfaccia ListModel. JList sta restituendo un'implementazione interna di ListModel.

Se è necessario accedere al modello sottostante, è necessario crearlo, impostarlo nel costruttore JList e conservarlo manualmente.

+0

non è necessario conservarlo! vedi la risposta di nikola despotoski è molto più efficiente! –

13

Ho riscontrato questo problema. Ho trovato questa semplice soluzione:

//----instantiation---- 

    JList mList = new JList(); 
    mList.setModel(new DefaultListModel()); 

    /*---- do whatever you want---- */ 

    //Retain it wherever you want with 
    DefaultListModel model = (DefaultListModel)mList.getModel(); 
+0

Ho avuto lo stesso problema ... La creazione con un nuovo modello di elenco predefinito corregge tutto. +1 – jessechk

1

Prima JList<String>.getModel(), è necessario inizializzare l'oggetto JList<String>.setModel(new DefaultModelList())

+1

niente di nuovo rispetto a una delle risposte precedenti, c'è ;-) – kleopatra

7

Se si sta utilizzando NetBeans

  1. Seleziona il tuo JList
  2. In proprietà, click il pulsante modello
  3. selezionare il "codice personalizzato" opzione
  4. Scrivi new DefaultListModel()

jList custom code

Problemi correlati