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 Calendars 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 CalendarEs wartet noch darauf, dass sie die 0. Reihe füllen, was ich wollte, aber was hat mich überhaupt daran gehindert, das zu tun?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top