Boa noite.
Estou tentanto usar o JTable através do Netbeans e estou tendo um problema para começar. A idéia é fazer uma tabela mostrar somente números inteiros que leio de um arquivo de texto. Eu primeiro leio o arquivo passo todos os valores para uma matriz e depois faço o JTable mostrar na tela.
Li o tutorial http://devsv.wordpress.com/2012/07/08/como-implementar-um-tablemodel/ e tentei fazer mais ou menos igual.
A primeira coisa que fiz foi estender a classe AbstractTableModel como mostrado abaixo:
importjava.util.List;importjavax.swing.table.AbstractTableModel;publicclassTabelaextendsAbstractTableModel{List<int[]>matriz;// Será uma matriz de valores inteiros que eu tentarei mostrar na tabela.// O método abaixo receberá uma matriz já formada por outra classe e definirá ela como atributo desta classe para eu poder mostrar na tabela. Como não posso herdar a classe que contém a tabela, a única solução que encontrei foi essa. publicvoidsetMatriz(List<int[]>matriz){this.matriz=matriz;}@OverridepublicintgetRowCount(){returnthis.matriz.size();}@OverridepublicintgetColumnCount(){returnthis.matriz.get(0).length;}@OverridepublicObjectgetValueAt(introwIndex,intcolumnIndex){thrownewUnsupportedOperationException("Not supported yet.");}}
TableModel myData = new MyTableModel();
JTable table = new JTable(myData);
Então lá na classe eu fiz assim:
// No momento em que faço a instanciação de Tabela, como abaixo, a matriz com os valores lidos do arquivo ainda não está formada.privateTabelatab=newTabela();jTable1=newjavax.swing.JTable(tab);// A declaração de JTable não está aqui. Achei desnecessário mostrar.
Mas quando tento compilar, acontece a seguinte exceção:
Exception in thread "main" java.lang.NullPointerException
at Tabela.getColumnCount(Tabela.java:22)
at javax.swing.JTable.createDefaultColumnsFromModel(JTable.java:1290)
at javax.swing.JTable.tableChanged(JTable.java:4389)
at javax.swing.JTable.setModel(JTable.java:3691)
at javax.swing.JTable.(JTable.java:633)
at javax.swing.JTable.(JTable.java:574)
at Interface.initComponents(Interface.java:94)
at Interface.(Interface.java:15)
at Main.main(Main.java:16)
Java Result: 1
Boa noite.
Estou tentanto usar o JTable através do Netbeans e estou tendo um problema para começar. A idéia é fazer uma tabela mostrar somente números inteiros que leio de um arquivo de texto. Eu primeiro leio o arquivo passo todos os valores para uma matriz e depois faço o JTable mostrar na tela.
Li o tutorial http://devsv.wordpress.com/2012/07/08/como-implementar-um-tablemodel/ e tentei fazer mais ou menos igual.
A primeira coisa que fiz foi estender a classe AbstractTableModel como mostrado abaixo:
importjava.util.List;importjavax.swing.table.AbstractTableModel;publicclassTabelaextendsAbstractTableModel{List<int[]>matriz;// Será uma matriz de valores inteiros que eu tentarei mostrar na tabela.// O método abaixo receberá uma matriz já formada por outra classe e definirá ela como atributo desta classe para eu poder mostrar na tabela. Como não posso herdar a classe que contém a tabela, a única solução que encontrei foi essa. publicvoidsetMatriz(List<int[]>matriz){this.matriz=matriz;}@OverridepublicintgetRowCount(){returnthis.matriz.size();}@OverridepublicintgetColumnCount(){returnthis.matriz.get(0).length;}@OverridepublicObjectgetValueAt(introwIndex,intcolumnIndex){thrownewUnsupportedOperationException("Not supported yet.");}}
TableModel myData = new MyTableModel();
JTable table = new JTable(myData);
Então lá na classe eu fiz assim:
// No momento em que faço a instanciação de Tabela, como abaixo, a matriz com os valores lidos do arquivo ainda não está formada.privateTabelatab=newTabela();jTable1=newjavax.swing.JTable(tab);// A declaração de JTable não está aqui. Achei desnecessário mostrar.
Mas quando tento compilar, acontece a seguinte exceção:
Exception in thread "main" java.lang.NullPointerException
at Tabela.getColumnCount(Tabela.java:22)
at javax.swing.JTable.createDefaultColumnsFromModel(JTable.java:1290)
at javax.swing.JTable.tableChanged(JTable.java:4389)
at javax.swing.JTable.setModel(JTable.java:3691)
at javax.swing.JTable.(JTable.java:633)
at javax.swing.JTable.(JTable.java:574)
at Interface.initComponents(Interface.java:94)
at Interface.(Interface.java:15)
at Main.main(Main.java:16)
Java Result: 1
O que está acontecendo?
A sua matriz está vazia uai!
this.matriz.get(0).length;
No índice 0 não tem nada por isso o NullPointerException, vocÊ está passando uma lista vazia para o construtor da classe Tabela.
R
robgeek
Mas eu não implementei o construtor de Tabela! Ele é o default, achei que ele não fizesse nada com o atributo linha. Por isso implementei o método “setMatriz(List<int[]> matriz)”, ele sim faz acesso ao atributo “linha” da classe.
E em "return this.matriz.get(0).length; ", eu não chamei o método em parte alguma do código, porque então ele está dando erro? Ele deveria dar erro se eu chamasse ele, aí sim, seria passado algo nulo para ele.
ViniGodoy
Por que a tabela é quem vai chamar os métodos do seu TableModel. A tabela “pergunta” ao TableModel as informações que tem que desenhar.
É o papel do TableModel explicar isso para ela.
E, mesmo que você corrija, com certeza vai dar outra exceção, pq a tabela usa o método getValueAt, usado pela tabela para saber que valores ela deve desenhar, está disparando uma exceção sozinho.
Note que isso está escrito, inclusive, no próprio tutorial que você linkou:
Por que a JTable precisa de um TableModel?
A JTable chama os métodos do TableModel para obter informações sobre o conteúdo da tabela, como número de linhas e colunas, conteúdo de cada célula, etc. Com estas informações em mãos, ela pode montar os dados na tela corretamente.
R
robgeek
Pessoal, resolvi o problema, muito obrigado. Vou dizer o que fiz.
Primeiro, reimplementei o método getValueAt, fiz como está abaixo:
Depois, no método "private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)" que é onde coloquei o código para ele ler o arquivo de texto que contém a tabela que quero mostrar, bem no final das instruções, depois que a matriz já está formada, coloquei o seguinte:
Achei que só podera passar minha tablemodel pelo construtor de JTable, aí olhei melhor na documentação java e vi o método setModel, aí tudo funcionou perfeitamente.