Utilizzando JLists e ListModels
Domanda
Ho definito una classe DirectoryListModel
che estende la classe AbstractListModel
dal API Java.
Internamente, ho un elenco di oggetti File
. Ho definito il metodo getElementAt(int index)
come:
@Override
public Object getElementAt(int index) {
return directoryElements.get(index)
}
Il problema è che quando provo a eseguire il mio JList con il mio DirectoryListModel
, sta andando a mostrare i percorsi completi dei file invece di solo i nomi dei file. Potrei cambiare questo codice per:
@Override
public Object getElementAt(int index) {
return directoryElements.get(index).getName();
}
e che sarebbe fare miracoli, ma il problema è che in caso onclick io voglio avere gli oggetti File in modo da poter fare qualche controllo con loro (controllo se sono le directory, ecc).
Se faccio ritorno getElementAt()
una stringa, sto perdendo questa possibilità, quindi mi piacerebbe konw se c'è un modo per formattare i miei oggetti File prima che i JList spettacoli loro nella mia finestra o se c'è qualche semplice e elegante modo di fare questo.
Grazie
Soluzione
Vorrei estendere il DefaultListCellRenderer per aggiungere il codice personalizzato per due motivi:
a) si otterrà il comportamento predefinito del renderer di default, come Borders, selezione fila mettendo in evidenza ...
b) Il renderer (come tutti i renderer altalena) è stato ottimizzato per una più rapida la pittura.
class MyRenderer extends DefaultListCellRenderer
{
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
{
Component c = super.getListCellRendererComponent(list,value,index,false,false) ;
JLabel label = (JLabel)c;
label.setText(...);
return c ;
}
}
Leggere la sezione dal tutorial Swing on come utilizzare liste per ulteriori informazioni sui renderer.
Altri suggerimenti
La cosa migliore da fare per voi è quello di utilizzare renderer. Renderers, come è possibile raccogliere dal nome, sono abituato a giocare il V
per M
i dati di backing nel paradigma MVC
. In questo caso, il vostro File
sono i dati di supporto, e il renderer viene utilizzato per visualizzare solo la parte del File
che si desidera visualizzare.
si dovesse implementare un renderer di celle personalizzato, estendendo una JLabel
e l'attuazione di ListCellRenderer
, si potrebbe iniziare con un semplice tentativo implementando il metodo un'interfaccia simile a questo:
public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
setText(((File)value).getName());
return this;
}
Date un'occhiata alla ListCellRenderer
javadoc per un po 'di più la guida.