Pergunta

Eu implementei um modelo de tabela personalizado da seguinte maneira:

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

Estou recebendo NullPointerException jogado pelo método acima, quando exibo um jtable com o Tablemodel acima.

Eu acho que a exceção se deve a algumas células vazias na tabela de banco de dados.

Se a exceção se deve a células vazias na tabela de banco de dados, como se locomover com esse problema?

Não é obrigatório que cada coluna do banco de dados tenha algum valor. Algumas colunas não podem conter nada.

Foi útil?

Solução

Se as células puderem conter valores vazios, chamando getClass () em um valor nulo certamente fornecerá o NPE. Claro que você pode verificar se há NULL, mas seu problema real é mais sutil do que isso.

A interface Tablemodel especifica que getColumnClass (int) deve voltar "A superclasse mais específica para todos os valores celulares da coluna". Pela aparência das coisas, você pode retornar qualquer número de tipos de classe para uma única coluna, quebrando efetivamente o contrato de Tabblemodel.

Normalmente, os tipos de colunas são estáticos para um determinado conjunto de dados da tabela, o que significa que a classe para uma coluna não deve alterar, a menos que os dados da tabela subjacentes tenham alterado. Eu acho que é importante perguntar por que você precisa retornar um valor tão específico.

No caso em que você deseja renderizar algo específico para um determinado tipo de classe, é melhor rolar o seu próprio TableCellRenderer, e determinar o tipo de objeto por célula. A partir daí, você pode fazer qualquer renderização específica, conforme necessário.

Outras dicas

Uma questão é o motivo pelo qual você está recebendo uma nula para essas coordenadas específicas. Se for legítimo e você só quer que nada de especial seja renderizado, então o que você precisa fazer é verificar e retornar objeto.class por exemplo,:

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

Isso garantirá que o renderizador padrão seja usado e, como não há valor, nada será renderizado.

Talvez:

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

Espero que isso ajude você.

Além das respostas até agora: assumindo que seu modelo seja apoiado por um List (como sugerido em sua pergunta anterior) Você verá um IndexOutOfBoundsException Se tentar renderizar seu JTable quando o TableModel não contém linhas (ou seja, o List está vazia). Este é um caso de borda desagradável (pois percebo que você está tentando renderizar um ResultSet - Como você sabe o ResultSet não estará vazio?).

Para evitar isso, por que você não fez o que eu sugeri originalmente e determinar a classe de cada coluna da ResultSetMetaData?

ResultSetMetAdata não fornece nenhuma informação sobre a classe. Ele fornece tipos de dados específicos de banco de dados que não são mapeados automaticamente para as classes Java (por exemplo, "Cidr" ou "Int8" no mundo PostgreSQL), então essa sugestão (que não incluiu nenhum código-fonte, a propósito) Não é realmente útil.

Além disso, o comentário "Eu acho importante perguntar por que você precisa devolver um valor tão específico", de Jason Nichols, mostra a falta de noção geral sobre como a classe jtable é usada no mundo real.

Gostaria de encontrar uma solução para esse problema em que as tabelas têm zero linhas, onde ainda posso descobrir qual é a classe Java que devo usar para renderizar minhas células para toda a coluna. A ideia de que a saída pode mudar é baseada em ainda mais falta de noção sobre bancos de dados - um tipo de dados de coluna é especificado na definição dessa coluna, e não importa qual seja o seu conteúdo que o tipo de dados não mude dependendo da linha que você ' estou olhando.

Obviamente, um dos desafios dos bancos de dados é que as definições de coluna podem ou não permitir valores nulos, e qualquer pessoa que subclaste a JTable para isso deve entender essa premissa muito básica e saber como testar isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top