JTable

7 respostas
m4des

Ola pessoal, estou usando um JTable para construir uma tabela que pegue alguns valores de um banco de dados do MySQL, o problema e que na hora de executar o codigo na tabela só aparece o ultimo valor em cada coluna, como faço para corrigir isso?

Abaixo o codigo:

import javax.swing.*;
import java.sql.*;
import java.awt.*;
public class TabelaBancoDados {
	JFrame frame = new JFrame("Usando JTable com MySQL");
	
	JTable tabela = null;
	JScrollPane scroll = null;
	
	final Dimension d = new Dimension(500,300);
		
	Connection c = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	
	final String usuario = "---";
	final String senha = "---";
	final String banco = "---";
	final String host = "---";
	final String prefixo = "jdbc:mysql://";
	final String lib = "com.mysql.jdbc.Driver";
	final String url = prefixo+host+"/"+banco;
	
	final String[] colunas = {"Campo","Tipo","Default","Null","Extra"};
	String[][] dados = null;
	
	final String sqlquery = "SHOW COLUMNS FROM "+banco;
	
	public TabelaBancoDados() {
		
		try {
			
			Class.forName(lib);
			c = DriverManager.getConnection(url, usuario, senha);
			stmt = c.prepareStatement(sqlquery);
			rs = stmt.executeQuery();
			
			while(rs.next()){
				
				String[][] dados_model = {{rs.getString("Field"),rs.getString("Type"),rs.getString("Default"),rs.getString("Null"),rs.getString("Extra")}};
				dados = dados_model;
				
			}
			
		}
		catch(Exception e){
			
			e.printStackTrace();
			
		}
		
		frame.setLayout(new FlowLayout());
		frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		
		tabela = new JTable(dados,colunas);
		tabela.setPreferredScrollableViewportSize(d);
		
		scroll = new JScrollPane(tabela);
		
		frame.getContentPane().add(scroll);
		frame.pack();
		frame.setResizable(false);
		frame.setSize(500, 300);
		frame.setVisible(true);
		
	}

	public static void main(String[] args) {
		new TabelaBancoDados();
	}

}

Se alguem puder me ajudar, agradeço.

7 Respostas

Adriano_Almeida

Olá,

para adicionar as linhas no JTable, é necessário trabalhar com o TableModel da tabela.

Dê uma olhada nesse artigo que ele mostra direitinho como fazer:

http://www.guj.com.br/java.tutorial.artigo.140.1.guj

davidbuzatto

Para seu algorítmo seria essa a solução.

Você não estava populando a matriz corretamente. Vc criava uma nova matriz a cada iteração, e atribuia uma matriz nova a sua matriz existente, sendo que essa matriz q era criada continha sempre a última linha do ResultSet.

int cont = 0;

while( rs.next() ){
    dados[ c ][] = {
        { rs.getString("Field"), rs.getString("Type"), rs.getString("Default"),
           rs.getString("Null"), rs.getString("Extra") } 
    };
    cont++;
}

Como dito seria interessante vc usar o TableModelo que ficaria mais fácil e simples.... Vou escrever um exemplo aqui e te passo.

Falow!

davidbuzatto

Dá uma olhada e testa para ver se funciona, eu não testei, mas acho q escrevi tudo corretamente :D

/*
 * Insere numa tabela, os valores do ResultSet usando um array de 
 * identificadores de colunas.
 */
public void preencheTabela( JTable tabela, String[] colunas, ResultSet rs ) 
        throws SQLException {

    /*
     * Atenção ao tamanho do array com os identificadores das colunas,
     * pois o modelo estará sendo criado a partir da quantidade de colunas
     * do ResultSet, obtido pelo ResulSetMetaData.
     */

    // cria um modelo vazio
    DefaultTableModel modelo = new DefaultTableModel();

    // obtém os meta dados do result set
    ResultSetMetaData rsmd = rs.getMetaData();

    // cria um array que conterá os dados da linha a ser adicionada
    Object[] novaLinha = new Object[ rsmd.getColumnCount() ];

    /* 
     * seta a quantidade de colunas e seus identificadores.
     * não testei, mas creio que o método serColumnCOunt não seja 
     * necessário pois setColumnIdentifiers provavelmente já deve usar o 
     * setColumnCount... Testa ai para ver se funciona.
     */
    modelo.setColumnCount( rsmd.getColumnCount() );
    modelo.setColumnIdentifiers( colunas );

    // itera pelas linhas do result set
    while ( rs.next() ) {

        // itera pelas colunas no result set, obtendo o valor das colunas
        for ( int i = 0; i < rsmd.getColumnCount(); i++ )
            novaLinha[ i ] = rs.getString( i + 1 );

        // insere uma nova linha no modelo
        modelo.addRow( novaLinha );
    }

    // configura o modelo da tabela
    tabela.setModel( modelo );

}
m4des

Valeu davidbuzatto! seu codigo funciona perfeitamente, finalmente resolvi o problema, obrigado pela ajuda!!!

Pafuncio vlw pela ajuda tambem!

Só mais uma pergunta, para que serve o ResultSetMetaData?

Guerr

Para uma criação de tabelas em Swing, sugiro dar uma olhada no framework que estou desenvolvendo. Ele facilita bem esta parte, inclusive facilitando a edição de dados dentro da tabela! Segue o link:

http://swingbean.sourceforge.net/

Vale a pena dar uma olhada!!

davidbuzatto

O ResultSetMetaData é uma interface que provê métodos para obtenção de informações sobre os dados q vc está recebendo. QUantidade de colunas, nome das mesmas, tipo das mesmas, etc.

Interface pq acessamos o objeto retornado pelo driver do banco, que implementa essa interface.

Falow!

m4des

Valeu pela explicação davidbuzatto!

Criado 3 de dezembro de 2006
Ultima resposta 4 de dez. de 2006
Respostas 7
Participantes 4