Question

Je l'ai mis en place un tableau personnalisé modèle comme suit:

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

Je reçois NullPointerException jeté par la méthode ci-dessus, quand j'afficher un JTable ayant la TableModel ci-dessus.

Je pense que l'exception est due à certaines cellules vides dans la table de base de données.

Si l'exception est due à des cellules vides dans la table de base de données, alors comment contourner ce problème?

Il est pas obligatoire pour chaque colonne de la base de données pour avoir une certaine valeur. Certaines colonnes peuvent contenir rien.

Était-ce utile?

La solution

Si les cellules peuvent contenir des valeurs vides, puis en appelant getClass () sur une valeur nulle, vous donnera certainement le NPE. Bien sûr, vous pouvez vérifier null, mais votre vrai problème est plus subtil que cela.

L'interface TableModel spécifie que TableCellRenderer et déterminer le type d'objet sur une base par cellule. De là, vous pouvez effectuer un rendu spécifique au besoin.

Autres conseils

Une question est pourquoi vous obtenez une valeur nulle pour ces coordonnées spécifiques. S'il est légitime et vous voulez juste être rendu rien de spécial, alors ce que vous devez faire est nul chèque et retourner Object.class par exemple,:.

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

Cela garantira que le moteur de rendu par défaut est utilisé, et puisqu'il n'y a pas de valeur, rien ne sera rendu.

Peut-être:

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

Je l'espère vous aide.

En plus des réponses à ce jour: En supposant que votre modèle est garantie par un List (comme suggéré dans votre question précédente) vous verrez un IndexOutOfBoundsException si essayant de rendre votre JTable lorsque le TableModel ne contient aucune ligne (la List est vide). Ceci est un cas de bord méchant (comme je me rends compte que vous essayez de rendre une ResultSet - Comment savez-vous le ResultSet ne sera pas vide).

Pour éviter cela, pourquoi ne vous faites ce que je suggère l'origine et déterminer la classe de chaque colonne du ResultSetMetaData?

ResultSetMetaData ne fournit aucune information sur la classe. Il fournit des types de données spécifiques à la base de données qui ne correspondent pas automatiquement aux classes Java (par exemple, « cidr » ou « int8 » dans le monde PostgreSQL) donc cette suggestion (qui ne comprenait pas le code source, par la voie) est pas vraiment utile.

En outre, le commentaire « Je pense qu'il est important de se demander pourquoi vous avez besoin de retourner une telle valeur spécifique » par Jason Nichols montre cluelessness générale sur la façon dont la classe JTable est utilisé dans le monde réel.

Je voudrais trouver une solution à ce problème où les tables ont zéro lignes, où je peux encore savoir ce que la classe Java est que je devrais utiliser pour rendre mes cellules pour la colonne entière. L'idée que la sortie peut changer est basée dans encore plus cluelessness sur les bases de données - un type de données de la colonne est spécifiée dans la définition de cette colonne, et peu importe ce que son contenu sont le type de données ne change pas en fonction de la ligne que vous » re le regardant.

Bien sûr, l'un des défis avec des bases de données est que les définitions de colonne peuvent ou ne peuvent pas permettre des valeurs NULL, et tout le monde sous-classing JTable pour ce qui devrait comprendre cette prémisse de base et de savoir comment tester cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top