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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top