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 Calendars 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 Calendars 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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top