[RESOLVIDO] Dúvidas com JTable

6 respostas
Metaleiro

[color=darkblue]Estou com alguns problemas com JTable, preciso utilizar os eventos que ela possui, queria também a partir de um botão atualizar os registros que ela possui, também preciso criar ações a partir do clique em suas células, usei o tutorial aqui do GUJ para implementar ela até agora, fiz uma pesquisa e até agora não encontrei soluções para os problemas que me apareceram, o método removeAll() parece funcionar mas dei um this.revalidate() e não apareceram as alterações, segue o código também, dei uma diminuida nele pois estava muito grande para facilitar : [/color]

public class Cliente extends JInternalFrame  implements ActionListener {

	/**
	 * Aqui estão declarados os Componentes
	 */

// Construtor

public Cliente() {

		this.btnGravar.addActionListener(this);

		super("Cadastro de Cliente");

		String[] columnNames = { "Quant.","Produto", "Largura", "Altura", "Ambiente", "Valor" };

		Object[][] data = {
				{ "Mary","Mary", "Campione", "Snowboarding", new Integer(5), new Boolean(false) },
				{ "Alison","Alison", "Huml", "Rowing", new Integer(3), new Boolean(true) },
				{ "Kathy","Kathy", "Walrath", "Knitting", new Integer(2), new Boolean(false) },
				{ "Sharon","Sharon", "Zakhour", "Speed reading", new Integer(20), new Boolean(true) },
				{ "Philip", "Philip", "Milne", "Pool", new Integer(10), new Boolean(false) } };

	table = new JTable(data, columnNames);
	table.setPreferredScrollableViewportSize(new Dimension(500,70));
	table.setFillsViewportHeight(true);
	pane = new JScrollPane(table);

      /**
	 * Componentes alinhados na tela 
	 */


gridBagConstraints.insets = new Insets(10, -100, 0, 0);
		gridBagConstraints.gridx = x++;
		gridBagConstraints.gridy = y;
gridBagLayout.setConstraints(this.pane, gridBagConstraints);
		painel.add(this.pane);

		// Adicona os componentes de tela ao conteiner.
		container.add(painel);

		// Monta o painel dos botões.
		painelBotoes.add(this.btnGravar);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(780, 400);
		setVisible(true);

}

public void actionPerformed(ActionEvent e) {

		// Caso o botão gravar foi pressionado.
		if (e.getSource() == this.btnGravar) {
			InsereProdutoDAO insere = new InsereProdutoDAO();
			List lista = insere.getLista();
                        this.pane.removeAll();
				this.table.removeAll();
				this.table.repaint();
				this.pane.add(table);
				this.pane.revalidate();

		}

	}

6 Respostas

T

Você pegou o exemplo do Java Tutorial, não?
http://java.sun.com/docs/books/tutorial/uiswing/components/table.htm
O importante é ler direito esse tutorial, até o fim.
O dado como um array bidimensional de strings não pode ser corretamente atualizado; para poder fazer isso direito, você tem de usar um outro TableModel.

Como isso é um porre, você pode usar uma outra coisa, que é mais fácil. Já ouviu falar de GlazedLists? Se puder usar isso, é melhor.

Metaleiro

[color=darkblue] Vou dar uma olhada melhor no tutorial, também vou ver se posso usar a solução que sugeriu, obrigado[/color]

Metaleiro

[color=darkblue]Resolvi como você explicou : [/color]

table.setModel(new javax.swing.table.DefaultTableModel(data, columnNames){});

[color=darkblue]Depois seleciono uma das linhas : [/color]

int[] l = table.getSelectedRows();
			    javax.swing.table.DefaultTableModel dtm = (javax.swing.table.DefaultTableModel)table.getModel();

			    for(int i = (l.length-1); i >= 0; --i)
			          dtm.removeRow(l[i]);

[color=darkblue]Mas ainda estou com uma dúvida, precisava ao selecionar uma linha executar uma ação ao clicar na linha, como se fosse um link ir para um JInteranalFrame, carregando os dados, isso é possível ? [/color]

ViniGodoy

Quando Deus falou a Moisés, havia mais um mandamento na tábua que na época ninguém entendeu, e por isso não foi transcrito para Bíblia.
Esse mandamento era:
“Não usarás DefaultTableModel”.

Se você quer fazer uma table com o triplo de dificuldade, ruim de manter e com um código porco, continue usando o DefaultTableModel. Claro que você vai ter o dobro de trabalho, mas há alguns masoquistas aqui no GUJ que adotam essa prática por pura preguiça de aprender o jeito certo.

Agora, se você quer realmente conhecer como se usa um JTable, leia esses dois ótimos tutoriais:
http://www.informit.com/articles/article.aspx?p=332278
http://www.informit.com/articles/article.aspx?p=333472

Estude esse exemplo:
http://www.guj.com.br/posts/list/98452.java#530523

E depois poderá usar até TableModels de maior qualidade, como esse aqui:
http://www.guj.com.br/posts/list/100793.java

Fernando_Generoso_da

Boa vini!! :lol:

Metaleiro

ViniGodoy:
Quando Deus falou a Moisés, havia mais um mandamento na tábua que na época ninguém entendeu, e por isso não foi transcrito para Bíblia.
Esse mandamento era:
“Não usarás DefaultTableModel”.

Se você quer fazer uma table com o triplo de dificuldade, ruim de manter e com um código porco, continue usando o DefaultTableModel. Claro que você vai ter o dobro de trabalho, mas há alguns masoquistas aqui no GUJ que adotam essa prática por pura preguiça de aprender o jeito certo.

[color=darkblue]
Obrigado Vini, vou procurar ler todos os artigos que postou, realmente dá uma pouco mais de trabalho, mas até agora consegui fazer tudo o que pretendia. [/color]

Criado 10 de fevereiro de 2009
Ultima resposta 11 de fev. de 2009
Respostas 6
Participantes 4