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.
V
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.