Java – JTable-Renderer pro Klasse ändern
-
16-09-2020 - |
Frage
Ich hatte gehofft, dass mir jemand etwas erklären könnte, als ich meine Lösung fand, aber ich verstehe nicht, warum es funktioniert.Ich wollte einen Standard-Renderer nach Klassentyp für eine ganze Tabelle festlegen, ohne bei der Erstellung zu wissen, wo sich die Objekte darin befinden werden.
Ich hatte eine JTable deklariert und den Standard-Renderer auf meinen eigenen festgelegt Calendar
Klasse, damit jeder Calendar
s würde eine sinnvolle Darstellung geben, nicht nur eine toString()
von ihnen selbst.
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));
}
}
Dies würde nicht funktionieren, bis ich die Methode überschrieben hätte getColumnClass
wie es gemacht wurde Hier
Laut Sun Dokumentation, es sieht aus wie getColumnClass
sollte genau das tun, was in dem oben angegebenen Beispiel überschrieben wurde – warum funktioniert es, wenn ich diese Methode überschreibe, aber nicht, wenn ich die Standardimplementierung verlasse?
Jetzt kann ich die Spalten damit füllen Calendar
Es wartet noch darauf, dass sie die 0. Reihe füllen, was ich wollte, aber was hat mich überhaupt daran gehindert, das zu tun?
Lösung
JTable ruft die Spaltenklasse aus dem Modell ab.Die Antwort liegt in der Implementierung von AbstractTableModel, vorausgesetzt, dass Ihr Tabellenmodell darauf basiert.Im AbstractTableModel wurde getColumnClass wie folgt implementiert: return Object.class;
Sofern Sie es also nicht überschreiben, werden die Spaltenobjekte immer als Objekt behandelt.Dies ist nichts, was das Modell automatisch handhaben wird.Sie müssen nur getColumnClass überschreiben, daran führt kein Weg vorbei.