Java - cambiando il rendering jttable per classe
-
16-09-2020 - |
Domanda
Speravo che qualcuno potesse spiegarmi qualcosa come ho trovato la mia soluzione, ma non capisco perché funziona. Volevo impostare un rendering predefinito per tipo di classe su un'intera tabella, non sapendo alla creazione in cui gli oggetti saranno in esso.
Avevo dichiarato un jtable e impostato il renderer predefinito a quello del mio, per la classe Calendar
in modo che qualsiasi Calendar
s darebbe una rappresentazione significativa, non solo un toString()
di se stessi.
JTable table = new JTable();
table.setDefaultRenderer(Calendar.class, new MyRenderer());
public class MyRenderer extends DefaultTableCellRenderer{
public MyRenderer() { super(); }
@Override
public void setValue(Object value){
setText(makeCalendarToDate((GregorianCalendar)value));
}
}
.
Questo non funzionerebbe finché non avrei invaso il metodo getColumnClass
come stato fatto qui
Secondo il sole Documentazione , sembra che getColumnClass
dovrebbe fare esattamente ciò che è stato sovrascritto nell'esempio che ho dato sopra - perché funziona quando sovrascrivo quel metodo ma non quando lascio l'implementazione delle azioni?
Ora posso riempire la colonna con i generatori di generatori in attesa che riempiono la 0a fila, che è ciò che volevo, ma ciò che mi ha impedito di farlo in primo luogo?
Soluzione
Jtable Ottiene la classe della colonna dal modello.La risposta risiede nell'attuazione di AbstractTableModel, supponendo che sia quello che hai basato il modello di tabella.In AbstractTableModel GetColumnClass è stato implementato in questo modo: return Object.class;
, quindi, a meno che non lo sovrascrive, gli oggetti della colonna verranno sempre gestiti come oggetto.Questo non è qualcosa che il modello gestirà automaticamente.Devi solo ignorare GeeColumnClass, non c'è modo di aggirare questo.