2010-07-16 5 views
1
renderer

J'espérais que quelqu'un pourrait me expliquer quelque chose que j'ai trouvé ma solution, mais je ne comprends pas pourquoi cela fonctionne. Je voulais définir un rendu par défaut par type de classe à une table entière, ne sachant pas à la création où les objets seront dans le tableau.Java - Modification JTable par classe

j'avais déclaré JTable et définir la valeur par défaut à celle de renderer moi-même, pour la classe Calendar de sorte que les Calendar s donneraient une représentation significative, non 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 fonctionnerait pas jusqu'à ce que je l'emporterait sur la méthode getColumnClass comme cela a été fait Here

Selon le soleil de Documentation, il semble que getColumnClass devrait faire exactement ce qui a été redéfinie dans l'exemple que j'ai donné ci-dessus - pourquoi il ne travailler quand je remplace cette méthode, mais pas quand je quitte l'implémentation de stock?

Maintenant, je peux remplir les colonnes Calendar en attendant qu'ils remplissent la 0e rangée, ce que je voulais, mais qu'est-ce qui m'a empêché de le faire en premier lieu?

Répondre

2

JTable obtient la classe de colonne du modèle. La réponse réside dans l'implémentation de AbstractTableModel, en supposant que c'est ce que vous avez basé sur votre modèle de table. En AbstractTableModel getColumnClass a été mis en œuvre comme ceci: return Object.class; Donc, à moins que vous le remplacez, les objets de colonne seront toujours traitées comme objet. Ce n'est pas quelque chose que le modèle va gérer automatiquement. Vous devez simplement remplacer getColumnClass, il n'y a pas moyen de contourner cela.

+0

si j'utilisais de JTable et non AbstractTableModel? Est-il toujours mis en œuvre de la même manière? – Ryan

+0

Si vous laissez JTable prendre soin du modèle, il utilisera DefaultTableModel si je me souviens bien. Et DefaultTableModel est basé sur AbstractTableModel. Je pense que toutes les implémentations qui viennent avec Swing fonctionnent de la même manière et je doute qu'il ne soit même pas possible de faire ce travail automatiquement. Vous pouvez vérifier ce que renvoie getValueAt mais cela ne fonctionnerait pas avec des valeurs nulles. – Carlos

+0

Génial! Alors qu'il fait sorte de sens, la Documentation AbstractTableModel correspond à ce que vous dites qu'il devrait être, il retourne juste la classe Object ... mais la documentation JTable indique qu'il retourne en fait la classe de (0, i), mais retourne toujours toujours Classe d'objet - une idée pour laquelle? Il déclare qu'il devrait retourner n'importe quelle classe qui est là. – Ryan

Questions connexes