Pregunta

He implementado un modelo de tabla personalizada de la siguiente manera:

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

Me estoy haciendo NullPointerException lanzada por el método anterior, cuando puedo mostrar un JTable tener la TableModel anteriormente.

Creo que la excepción se debe a algunas celdas vacías en la tabla de base de datos.

Si la excepción se debe a celdas vacías en la tabla de base de datos, a continuación, cómo moverse con este problema?

No es obligatorio para todas las columnas de la base de datos para tener algún valor. Algunas columnas pueden contener nada.

¿Fue útil?

Solución

Si las células pueden contener valores vacíos, a continuación, llamar getClass () en un valor nulo sin duda le dará la NPE. Claro que se puede comprobar NULL, pero el verdadero problema es más sutil que eso.

La interfaz TableModel especifica que getColumnClass (int) debe devolver " la superclase más específico para todos los valores de las celdas de la columna. " Desde el aspecto de las cosas, que se puede devolver cualquier número de tipos de clase para una sola columna, rompiendo efectivamente el contrato TableModel.

Típicamente, los tipos de columna son estáticos para un conjunto dado de datos de la tabla, lo que significa la clase para una columna no debe cambiar a menos que los datos de tabla subyacente ha cambiado. Creo que es importante preguntarse por qué tiene que devolver un valor tan específico.

En el caso en el que desea hacer algo específico para un tipo de clase dada, es mejor rodar su propia TableCellRenderer , y determinar el tipo de objetos en función de cada célula. Desde allí se puede hacer ninguna prestación específica, según sea necesario.

Otros consejos

Una cuestión es por eso que está recibiendo un nulo para estas coordenadas específicas. Si es legítimo y lo que desea nada especial que pasarán a ser, entonces lo que hay que hacer es nulo cheque y volver Object.class por ejemplo,:.

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

Esto asegurará que se utiliza el procesador predeterminado, y puesto que no hay ningún valor, nada va a ser prestado.

Tal vez:

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

Espero que le ayuda.

Además de las respuestas hasta el momento: Asumiendo que su modelo está respaldado por una List (como se sugiere en su pregunta anterior) verás un IndexOutOfBoundsException si se intenta hacer que su JTable cuando el TableModel contiene ninguna fila (es decir, el List es vacío). Este es un caso extremo desagradable (como me di cuenta de que estás tratando de hacer que un ResultSet - ¿Cómo sabe el ResultSet no estará vacía).

Para evitar esto, ¿por qué no haces lo que se propuso inicialmente y determinar la clase de cada columna de la ResultSetMetaData?

ResultSetMetaData no proporciona ninguna información sobre la clase. Sí proporciona tipos de datos de base de datos específica que no se asignan automáticamente a las clases de Java (por ejemplo, "CIDR" o "INT8" en el mundo PostgreSQL) por lo que esta sugerencia (que no incluye ningún código fuente, por cierto) en realidad no es muy útil.

Además, el comentario "Creo que es importante preguntarse por qué tiene que devolver un valor tan específico" por Jason Nichols muestra despiste general acerca de cómo se utiliza la clase JTable en el mundo real.

Me gustaría encontrar una solución a este problema en el que las tablas tienen cero filas, donde todavía puede averiguar lo que la clase Java es que debo utilizar para hacer mis células para toda la columna. La idea de que la salida puede cambiar se basa en aún más despiste sobre bases de datos - un tipo de datos de columna se especifica en la definición de esa columna, y no importa lo que su contenido es el tipo de datos no cambia dependiendo de lo que la fila' re buscando a él.

Por supuesto, uno de los retos con bases de datos es que las definiciones de columna pueden o no permitir valores NULL, y cualquiera subclasificar JTable para este deben entender esta premisa muy básica y saber cómo probar esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top