lógica para colocar dados de um input em um jTable

19 respostas
paulohms

Boa noite galera.

estou fazendo uma aplicação para aprender alguns conceitos de java, que é o seguinte, recebo dados de um HTML pela api do IO, depois separo os arquivos que eu quero utilizando expressões regulares, e jogo dentro de um .txt novamente com os dados que eu preciso porem já separado e limpo das tags html. Agora o que estou com dúvida e não consigo pensar na lógica, é de como colocar esses dados em um jTable, sendo que os arquivos são quebrados em 6 dezenas por exemplo:

10 20 30 40 50 60
23 43 43 22 11 56
02 56 70 21 44 01

estou jogando o resultado final do .txt em um ArrayList, porem são separados por linhas como no exemplo acima, alguem sabe como vou conseguir colocar eles na tabela separando por colunas e linhas ?

19 Respostas

War_Paz

for(int i = 0; i < quantasLinhasQuiser; i++){ for(int ii = 0; ii < 6; ii++){ tabela.add(arrayList.get(ii)); } // Nunca mexi com JTable, mas aqui você colocaria algo para ir para a próxima linha =) }

Suponho que seja isso

ViniGodoy

Veja na minha assinatura o tutorial sobre TableModel.

Não tem absolutamente nada a ver com o que o colega postou. Nem sequer for você vai usar.

paulohms

Vini, olhei um exemplo que está no link da sua assinatura, entendi como que funciona, só ficou uma dúvida, o exemplo que eu vi utilizava o objeto da classe Socio para popular a tabela, no meu caso como eu tenho as informações dentro de um ArrayList, vou precisar quebrá-lo em token’s para que seja adicionado na tabela ?
Caso seja, quando eu quebra-los em pedaços, qual referencia terei dos mesmos ? o index ? por exemplo se eu tiver os valores:

01 02 03 04 05
11 25 48 53 20

em um objeto valores do tipo List, eu pegaria: valores.get(indice) ?

Desde já obrigado.

ViniGodoy

Sim, precisaria. Mas isso você já consegue com um simples split.

Fazendo o split no espaço, cada numero desse ficaria num índice de coluna.

paulohms

Vini, desculpa a ignorancia cara, mais você pode me mostrar um exemplo ?

Obrigado mais uma vez.

ViniGodoy

Isso está em uma String só, ou numa lista com Strings?

paulohms

Em uma lista com Strings.

ViniGodoy

Então, vc cria um array assim:

String[] colunas = suaLista.get(line).split(" ");

E aí no tableModel é só retornar

colunas[column];
paulohms

Vini, não estou conseguindo, segue o código caso poder dar uma ajuda:

package TESTE;

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

import REGEX.Aplicacao;

public class TableModel extends AbstractTableModel {

	Aplicacao ap = new Aplicacao();
	private List<String> linhas;

	private String[] colunas = new String[] {
			"Concurso", "1ª Dezena", "2ª Dezena", "3ª Dezena", "4ª Dezena", "5ª Dezena", "6ª Dezena"};


	
	public TableModel() throws Exception {
		linhas = ap.getValores();
	}

	public TableModel(List<String> lista) throws Exception {
		linhas = ap.getValores();
	}


	@Override
	public int getColumnCount() {

		return colunas.length;
	}

	@Override
	public int getRowCount() {

		return linhas.size();
	}
	
	@Override
	public String getColumnName(int columnIndex) {
	
		return colunas[columnIndex];
	};

	@Override
	public Class<?> getColumnClass(int columnIndex) {

		switch (columnIndex) {
		case 0: 
			return int.class;
		case 1: 
			return String.class;
		case 2: 
			return String.class;
		case 4: 
			return String.class;
		case 5: 
			return String.class;
		case 6: 
			return String.class;
		default:
			throw new IndexOutOfBoundsException("columnIndex out of bounds");
		}
	}

	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		
		return colunas[columnIndex];
		
	}

	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
		
	}

	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return false;
	}

	public void limpar() {

		linhas.clear();
		fireTableDataChanged();
	}

	public boolean isEmpty() {
		return linhas.isEmpty();
	}

}

E também tenho essa classe:

package TESTE;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;


public class TableModelTest extends JFrame {
	
	private JPanel			pnlBotoes;
	private JTable  		tbl;
	private TableModel model;
	
	public TableModelTest() throws Exception {
		super("Teste com Socio Table Model");
		initialize();
	}
	
	private void initialize() throws Exception {
		setSize(800, 600);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		getContentPane().add(new JScrollPane(getTbl()));
		getContentPane().add(getPnlBotoes(), BorderLayout.SOUTH);
	}
	
	private JTable getTbl() throws Exception{
		if (tbl == null) {
			tbl = new JTable();
			tbl.setModel(new TableModel());
		}
		return tbl;
	}
	
	private TableModel getModel() throws Exception {
		if (model == null) {
			model = (TableModel) getTbl().getModel();
		}
		return model;
	}
	
	private JPanel getPnlBotoes() {
		if (pnlBotoes == null) {
			pnlBotoes = new JPanel();
		}
		return pnlBotoes;
	}
	
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				try {
					new TableModelTest().setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
	
}

Os dados vem do método getValores() da classe Aplicação.

Está gerando essa exceção: java.lang.NullPointerException

Se tiver algo muito errado, não esquenta por favor pois estou fazendo testes para aprender.

Vlw pela ajuda.

ViniGodoy

Comentários:

package TESTE;

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

import REGEX.Aplicacao;

public class TableModel extends AbstractTableModel {
	Aplicacao ap = new Aplicacao();
	private List&lt;String&gt; linhas;

	private String[] colunas = new String[] {
			&quot;Concurso&quot;, &quot;1ª Dezena&quot;, &quot;2ª Dezena&quot;, &quot;3ª Dezena&quot;, &quot;4ª Dezena&quot;, &quot;5ª Dezena&quot;, &quot;6ª Dezena&quot;};


	
	public TableModel() throws Exception {
		linhas = ap.getValores();
	}

        //Não é necessário o segundo construtor


	@Override
	public int getColumnCount() {
		return colunas.length;
	}

	@Override
	public int getRowCount() {
		return linhas.size();
	}
	
	@Override
	public String getColumnName(int columnIndex) {
		return colunas[columnIndex];
	};

	@Override
	public Class&lt;?&gt; getColumnClass(int columnIndex) {
		switch (columnIndex) {
		case 0: 
			return int.class;
		case 1: 
		case 2: 
		case 3: 
		case 4: 
		case 5: 
		case 6: 
			return String.class;

		default:
			throw new IndexOutOfBoundsException(&quot;columnIndex out of bounds&quot;);
		}
	}

	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
                //Aqui você deve retornar o valor, que está na linha rowIndex
                //E na coluna indicada por columnIndex. 
		String[] valoresLinha = linhas.get(rowIndex).split(&quot; &quot;);
		return valoresLinha[columnIndex];
	}

	@Override
	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
	}

	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return false;
	}

	public void limpar() {
		linhas.clear();
		fireTableDataChanged();
	}

	public boolean isEmpty() {
		return linhas.isEmpty();
	}
}

Agora, se dá NullPointerException, talvez seja um erro da sua classe REGEX.Aplicacao. Seria bom você postar em que linha o erro ocorre.

paulohms
package REGEX;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.Reader;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Aplicacao {

	public static void main(String args[]) throws Exception{
		
				
	}
	
	public List getValores() throws Exception{
		
		Reader r = new FileReader("D://Desktop//D_MEGA.html");
		BufferedReader br = new BufferedReader(r);
		Writer w = new FileWriter("teste.txt");
		List<String> valores = null;
		
		String texto;
		int contador = 0;
		
		while((texto = br.readLine()) != null){
		
		Pattern p = Pattern.compile("<td>\\d{2}</td>");
		Matcher m = p.matcher(texto);
		
		while(m.find()){
		
			if(contador %6 == 0)
				w.write("\n");
			
		w.write(m.group()+" ");	
		
		contador++;
		}
	  }
		
		r.close();
		w.close();
	
		Reader r2 = new FileReader("teste.txt");
		BufferedReader br2 = new BufferedReader(r2);
	
		String texto2 ;
		int contador2 = 0 ;
		
		while((texto2 = br2.readLine()) != null){
		
			valores.add(texto2);
			
		}				
		
		return valores; 

	}
	
}

O erro está acontecendo na linha 59. Olhe a exceção gerada:

java.lang.NullPointerException
at REGEX.Aplicacao.getValores(Aplicacao.java:59)
at TESTE.TableModel.(TableModel.java:20)
at TESTE.TableModelTest.getTbl(TableModelTest.java:39)
at TESTE.TableModelTest.initialize(TableModelTest.java:32)
at TESTE.TableModelTest.(TableModelTest.java:26)
at TESTE.TableModelTest$1.run(TableModelTest.java:63)

Caraca, to apanhando muito desse trem, rsrsrs, que trabalheira hein...

ViniGodoy

Ao invés disso:

List&lt;String&gt; valores = null;

Use isso:

List&lt;String&gt; valores = new ArrayList&lt;&gt;();

Se for Java 6 ou inferior:

List&lt;String&gt; valores = new ArrayList&lt;String&gt;();
paulohms

Ai Vini, o erro agora é outro, você sabe o que pode ser agora ? :blush:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 6
	at TESTE.TableModel.getValueAt(TableModel.java:64)
	at javax.swing.JTable.getValueAt(Unknown Source)
	at javax.swing.JTable.prepareRenderer(Unknown Source)
	at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
	at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
	at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
	at javax.swing.plaf.ComponentUI.update(Unknown Source)
	at javax.swing.JComponent.paintComponent(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JComponent.paintToOffscreen(Unknown Source)
	at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
	at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
	at javax.swing.RepaintManager.paint(Unknown Source)
	at javax.swing.JComponent._paintImmediately(Unknown Source)
	at javax.swing.JComponent.paintImmediately(Unknown Source)
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.access$700(Unknown Source)
	at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$200(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Obrigado pela ajuda…

ViniGodoy

Aparentemente tem uma coluna a mais na sua tabela.

Tente eliminar do cabeçalho a coluna “Concurso”. Afinal, ela não está na sua String.

paulohms

O erro continua… quando executo a aplicação, é mostrado a jTable, porem sem as informações, quando eu seleciono a tabela e passo o mouse sobre ela, as informações são exibidas, porem no console continua mostrando a exceção, cheguei a fazer um teste passando um documento de texto com menas informações, para fazer o testes, mais ainda gera a exceção:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1
	at TESTE.TableModel.getValueAt(TableModel.java:64)
	at javax.swing.JTable.getValueAt(Unknown Source)
	at javax.swing.JTable.prepareRenderer(Unknown Source)
	at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
	at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
	at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
	at javax.swing.plaf.ComponentUI.update(Unknown Source)
	at javax.swing.JComponent.paintComponent(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JComponent.paintChildren(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JViewport.paint(Unknown Source)
	at javax.swing.JComponent.paintChildren(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JComponent.paintToOffscreen(Unknown Source)
	at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
	at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
	at javax.swing.RepaintManager.paint(Unknown Source)
	at javax.swing.JComponent._paintImmediately(Unknown Source)
	at javax.swing.JComponent.paintImmediately(Unknown Source)
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.access$700(Unknown Source)
	at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$200(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
ViniGodoy

Provavelmente está faltando tratar para o caso da lista vazia.

paulohms

Vini, comentei uma linha para testar o erro sumiu… só que só é apresentado 1 linha da tabela, pois antes estava dando a quebra de linha de a cada 6 valores:

while(m.find()){
		
		//	if(contador %6 == 0)
		//		w.write("\n");
			
		w.write(m.group()+" ");	
		
		contador++;
		}
	  }

Você sabe alguma outra forma de eu separar os arquivos em linhas com 6 valores cada ?

Malz ai a trabalheira… Vlw

paulohms

Ainda não consegui, será que realmente não tem como ?

Alguem pode ajudar ?

paulohms

Alguem pode ajudar ?

Criado 29 de janeiro de 2013
Ultima resposta 8 de fev. de 2013
Respostas 19
Participantes 3