Domanda

Ho implementato un modello di tabella personalizzata come segue:

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

Io sono sempre NullPointerException gettato con il suddetto metodo, quando visualizzo un JTable avendo il TableModel sopra.

Credo che l'eccezione è dovuto ad alcune celle vuote nella tabella del database.

Se l'eccezione è dovuta a celle vuote nella tabella del database, allora come aggirare questo problema?

Non è obbligatorio per ogni colonna nel database per avere un certo valore. Alcune colonne possono contenere nulla.

È stato utile?

Soluzione

Se le cellule possono contenere valori vuoti, quindi chiamando getClass () su un valore nullo sicuramente vi darà la NPE. Certo si può verificare per nulla, ma il problema reale è più sottile di quello.

L'interfaccia TableModel specifica che getColumnClass (int) deve restituire " superclasse più specifica per tutti i valori delle celle della colonna. " Dalla bellezza di cose, si potrebbe essere di restituire un certo numero di tipi di classe per una singola colonna, rompendo in modo efficace il contratto TableModel.

Tipicamente, tipi di colonna sono statici per un dato insieme di dati della tabella, cioè della classe per una colonna non dovrebbe cambiare a meno che i dati della tabella sottostante è cambiato. Penso che sia importante chiedersi perché è necessario restituire un valore così specifico.

Nel caso in cui si desidera rendere qualcosa di specifico per un determinato tipo di classe, è meglio posizionare il proprio TableCellRenderer , e determinare il tipo di oggetto su una base per-cellula. Da lì si può fare qualsiasi rappresentazione specifica, se necessario.

Altri suggerimenti

Un problema è il motivo per cui si stanno ottenendo un nullo per queste coordinate specifiche. Se è legittimo e si vuole proprio niente di speciale da rendere, allora quello che dovete fare è nullo-check e tornare Object.class per esempio,:.

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

Questo farà sì che il renderer di default viene usato, e dal momento che non v'è alcun valore, nulla sarà reso.

Forse:

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

Spero che ti aiuta.

In aggiunta alle risposte finora: Assumendo che il modello è sostenuto da una List (come suggerito nella domanda precedente) vedrete un IndexOutOfBoundsException se il tentativo di rendere il JTable quando il TableModel contiene nessuna riga (vale a dire il List è vuoto). Si tratta di un caso limite brutto (come mi rendo conto che si sta tentando di rendere un ResultSet -? Come fai a sapere il ResultSet non sarà vuoto).

Per evitare questo, perché non hai fatto quello che ho suggerito in origine e determinare la classe di ogni colonna dal ResultSetMetaData?

ResultSetMetaData non si prevede alcuna informazioni sulla classe. Esso fornisce tipi di dati specifiche del database che non mappano automaticamente alle classi Java (ad esempio, "cidr" o "int8" nel mondo PostgreSQL) in modo da questo suggerimento (che non include alcun codice sorgente, tra l'altro) in realtà non è utile.

Inoltre, il commento "Credo che sia importante chiedersi perché è necessario restituire un valore così specifico" di Jason Nichols mostra stupidità generale su come la classe JTable è utilizzato nel mondo reale.

Mi piacerebbe trovare una soluzione a questo problema in cui le tabelle hanno zero righe, dove posso ancora scoprire ciò che la classe Java è che dovrei usare per rendere le mie cellule per l'intera colonna. L'idea che l'uscita può cambiare è basata in ancora più cluelessness sui database - un tipo di dati di colonna è specificato nella definizione di quella colonna, e non importa ciò che i suoi contenuti sono il tipo di dati non cambia a seconda di quale riga che si' nuovamente alla ricerca di esso.

Naturalmente una delle sfide con le banche dati è che le definizioni delle colonne possono o non possono consentire i valori NULL, e chiunque sub-classing JTable per questo dovrebbero capire questa premessa molto semplice e sapere come testare per questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top