Frage

Ich habe wie folgt ein benutzerdefiniertes Tabellenmodell implementiert:

public class MyTableModel extends AbstractTableModel {
    ...
    ...
    @Override
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }
    ...
    ...
}

Ich erhalte NullPointerexception von der obigen Methode, wenn ich ein JTabelle mit dem obigen Tablemodel anzeige.

Ich denke, dass die Ausnahme auf einige leere Zellen in der Datenbanktabelle zurückzuführen ist.

Wenn die Ausnahme auf leere Zellen in der Datenbanktabelle zurückzuführen ist, wie kann man sich mit diesem Problem umgehen?

Für jede Spalte in der Datenbank ist es nicht obligatorisch, einen gewissen Wert zu haben. Einige Spalten können nichts enthalten.

War es hilfreich?

Lösung

Wenn Zellen leere Werte enthalten können, gibt Ihnen das Aufrufen von GetClass () auf einem Nullwert sicherlich das NPE. Natürlich können Sie nach Null suchen, aber Ihr wirkliches Problem ist subtiler.

Die Tablemodel -Schnittstelle gibt das an GetColumnClass (int) sollte zurückkehren "Die spezifischste Superklasse für alle Zellwerte in der Spalte." Aus dem Aussehen von Dingen könnten Sie eine beliebige Anzahl von Klassentypen für eine einzige Spalte zurückgeben und den Tablemodel -Vertrag effektiv durcheinander bringen.

In der Regel sind Spaltentypen für einen bestimmten Satz von Tabellendaten statisch, was bedeutet, dass sich die Klasse für eine Spalte nicht ändern sollte, wenn sich die zugrunde liegenden Tabellendaten geändert haben. Ich denke, es ist wichtig zu fragen, warum Sie einen so bestimmten Wert zurückgeben müssen.

In dem Fall, in dem Sie für einen bestimmten Klassentyp etwas spezifisches Rendern machen möchten, sind Sie besser dran, Ihre eigenen zu rollen Tablecellrenderer, und bestimmen des Objekttyps pro Zellbasis. Von dort aus können Sie nach Bedarf ein bestimmtes Rendering durchführen.

Andere Tipps

Ein Problem ist, warum Sie für diese spezifischen Koordinaten einen Null erhalten. Wenn es legitim ist und Sie nur wollen, dass nichts Besonderes gerendert wird, müssen Sie das Objekt null und zurückgeben. Klasse EG,:

   public Class getColumnClass(int c) {
        Object o = getValueAt(0, c);
        if(o==null) return Object.class;
        return o.getClass()
    }

Dadurch wird sichergestellt, dass der Standard -Renderer verwendet wird, und da es keinen Wert gibt, wird nichts gerendert.

Vielleicht:

public Class getColumnClass(int c) {
        return (getValueAt(0, c) == null ? Object.class : getValue(0, c).getClass());
  }

Ich hoffe es hilft dir.

Zusätzlich zu den bisherigen Antworten: Angenommen, Ihr Modell wird von a unterstützt List (Wie in Ihrer vorherigen Frage vorgeschlagen) Sie werden eine sehen IndexOutOfBoundsException Wenn Sie versuchen, Ihre zu rendern JTable wenn der TableModel enthält keine Zeilen (dh die List ist leer). Dies ist ein böser Rand -Fall (als ich feststelle, dass Sie versuchen, a zu rendern ResultSet - Woher kennst du das? ResultSet wird nicht leer sein?).

Um dies zu vermeiden, warum haben Sie nicht das getan, was ich ursprünglich vorgeschlagen habe, und bestimmen die Klasse jeder Spalte aus dem ResultSetMetaData?

ResultsetMetadata enthält keine Informationen über die Klasse. Es enthält datenbankspezifische Datentypen, die nicht automatisch den Java-Klassen (z. B. "CIDR" oder "int8" in der PostgreSQL-Welt abgeben, sodass dieser Vorschlag (der übrigens keinen Quellcode enthielt). Ist nicht wirklich hilfreich.

Der Kommentar "Ich denke, es ist wichtig zu fragen, warum Sie einen so spezifischen Wert von Jason Nichols zurückgeben müssen" zeigt allgemeine Ahnungslosigkeit darüber, wie die JTable -Klasse in der realen Welt verwendet wird.

Ich würde gerne eine Lösung für dieses Problem finden, bei der Tabellen keine Zeilen haben, bei denen ich immer noch herausfinden kann, was die Java -Klasse ist, dass ich meine Zellen für die gesamte Spalte rendern sollte. Die Idee, dass sich die Ausgabe ändern kann, basiert auf noch mehr Ahnung in Bezug auf Datenbanken - ein Spaltendatentyp wird in der Definition dieser Spalte angegeben, und unabhängig von seinem Inhalt ändert sich der Datentyp nicht, je nachdem, welche Zeile Sie sind. ' schauen es.

Natürlich besteht eine der Herausforderungen mit Datenbanken darin, dass Spaltendefinitionen Nullwerte zulassen oder nicht, und jeder, der dafür subklassifiziert wird, sollte diese sehr grundlegende Prämisse verstehen und wissen, wie man dies testet.

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