Java - Changement de JTable rendu par classe
-
16-09-2020 - |
Question
J'espérais que quelqu'un pourrait expliquer quelque chose pour moi, car j'ai trouvé ma solution, mais je ne comprends pas pourquoi cela fonctionne.Je voulais mettre un moteur de rendu par défaut par type de Classe à un ensemble de la table, ne sachant pas lors de la création où les objets seront en elle.
J'avais déclaré une JTable et définir le moteur de rendu par défaut à celle de la mienne, pour l' Calendar
de la classe, de sorte que tout Calendar
s donnerait une représentation signifiante, pas seulement un toString()
d'eux-mêmes.
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));
}
}
Cela ne fonctionnera pas jusqu'à ce que j'ai changé la méthode getColumnClass
comme on l'a fait Ici
En fonction du soleil La Documentation, il ressemble getColumnClass
faire exactement ce qui a été remplacée dans l'exemple que j'ai donné ci-dessus - pourquoi ça marche quand je remplacer cette méthode, mais pas quand je quitte le stock de mise en œuvre?
Maintenant, je peux remplir la colonne avec Calendar
s en attendant ils remplissent les 0e ligne, ce qui est ce que je voulais, mais ce qui m'a empêché de le faire en premier lieu?
La solution
JTable obtient la colonne classe à partir du modèle.La réponse réside dans la mise en œuvre de AbstractTableModel, en supposant que ce que vous avez fondé votre modèle de table sur.Dans AbstractTableModel getColumnClass a été mis en place comme ceci: return Object.class;
Donc, sauf si vous la remplacez, la colonne objets seront toujours traitées comme des Objets.Ce n'est pas quelque chose que le modèle va gérer automatiquement.Vous avez juste à remplacer getColumnClass, il n'y a pas moyen de contourner cela.