JTable e Consulta SQL

2 respostas
C

Em minha aplicação faço uma consulta por palavra chave no banco de dados, mas não esta funcionando direito, pois após a primeira consulta, ao fazer outra o scrollpane não funciona, alguém poderia me dar algumas dicas o código é o seguinte:

import java.awt.<em>;

import java.awt.event.</em>;

import java.sql.<em>;

import javax.swing.</em>;

import javax.swing.border.<em>;

import java.util.</em>;

public class PropPesquisar3 extends JFrame{

private Connection con;
private JTable tabela;
private JPanel painel1,painel2,painel3;
private Container janela;
private JLabel l1,l2;
private JTextField c1,c2;
private JButton b1,b2;


public PropPesquisar3(){   

super("Proposta - Pesquisa por Palavra Chave");
setDefaultCloseOperation(DISPOSE_ON_CLOSE);

    l1=new JLabel("DIGITE A PALAVRA CHAVE:");
    c1=new JTextField("",10);
    b1=new JButton("BUSCAR");
    b1.addActionListener(new BtnBuscar());
    l2=new JLabel("NÚMERO DA PROPOSTA:");
    c2=new JTextField("",10);
    b2=new JButton("SELECIONAR");
     
    
    painel1=new JPanel();
    painel2=new JPanel();
    painel3=new JPanel();
    
    Border borda=BorderFactory.createEtchedBorder();
	Border borda2=BorderFactory.createRaisedBevelBorder();
	
	painel1.setBorder(borda2);
	painel2.setBorder(borda);
	painel3.setBorder(borda2);
    
    painel1.add(l1);
    painel1.add(c1);
    painel1.add(b1);
    
    painel3.add(l2);
    painel3.add(c2);
    painel3.add(b2);
    
    
    
    
    janela=getContentPane();
	janela.add(painel1,BorderLayout.NORTH);
	janela.add(painel2,BorderLayout.CENTER);
	janela.add(painel3,BorderLayout.SOUTH);
	
	setSize(550,350);
	setResizable(false);
	
}
public class BtnBuscar implements ActionListener{
	public void actionPerformed(ActionEvent e){

		String url = "jdbc:odbc:BDProposta"; 
		String usuario = "";
		String senha = "";
		
		try{

			Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
			con = DriverManager.getConnection(url, usuario, senha);

		}
		catch (Exception exe){
 			System.out.println("Falha na Conexão");
		}
		buscaTabela();
	}

private void buscaTabela(){

String palavra=c1.getText();
Statement st;
ResultSet res;
  		
try{
	
	
		
	
   		
   		Vector cabecalho = new Vector();
   		Vector linhas = new Vector();
   		st = con.createStatement();
   		res = st.executeQuery("select Número,Assunto from Proposta where assunto like'%"+String.valueOf(palavra)+"%'");
   		if(c1.equals("")){
		
		JOptionPane.showMessageDialog(null,
		"Digite a palavra chave!",
		"Aviso",
		JOptionPane.INFORMATION_MESSAGE);
	}else{
   		
   		res.next();  

   		ResultSetMetaData rsmd = res.getMetaData();

   for (int i = 1; i <= 2; ++i) 
      cabecalho.addElement(rsmd.getColumnName(i));
   do 
    {
    linhas.addElement(proximaLinha(res,rsmd)); 
    } 
   while (res.next());       

   tabela = new JTable(linhas,cabecalho);
   tabela.getColumnModel().getColumn(0).setPreferredWidth(150);
   tabela.getColumnModel().getColumn(1).setPreferredWidth(1000);
   JScrollPane scroller = new JScrollPane( tabela );
   getContentPane().add(scroller, BorderLayout.CENTER);
   validate();
   //tabela.setEditable(false);
   st.close();
   con.close();
		}
   }
catch (SQLException sqlex) {

}

}
private Vector proximaLinha(ResultSet rs, ResultSetMetaData rsmd){

Vector LinhaAtual = new Vector();

try{

for (int i = 1; i <= 2; ++i)

switch(rsmd.getColumnType(i)){

case Types.VARCHAR: LinhaAtual.addElement(rs.getString(i));

break;

case Types.LONGVARCHAR: LinhaAtual.addElement(rs.getString(i));

break;

case Types.NUMERIC: LinhaAtual.addElement(new Long(rs.getLong(i)));

break;

}

}

catch(SQLException e){

}

return LinhaAtual;
}
	
}

}

2 Respostas

cv1

Voce esta jogando TODAS as exceptions fora (ou seja, voce nao esta fazendo com elas quando as infelizes acontecem). Entao, vai ser dificil mesmo saber onde esta o erro. Trate as excecoes apropriadamente e ai tudo fica facil :wink:

J

E faça mais um favor a vc mesmo, crie um TableModel decente para essa tabela…
Aqui vai um código exemplo de TableModel que pode te ajudar (o exemplo é meu, baseado num parecido do livro "Design Patterns Java Workbook).

public class ProdutoTableModel extends AbstractTableModel

{

private Produto[] osProdutos;

private static String[] rotulosDasColunas = {Produto,Preço, Em Promoção?};
/** Uma instância dessa classe deve necessariamente 
 *estar ligada a um array de produtos. 
 */
public ProdutoTableModel(Produto[] produtos)
{
    osProdutos = produtos;
}

/** Esse método retorna o valor que deve ser impresso 
 *em cada célula da tabela. 
 */
public Object getValueAt(int linha, int coluna)
{
    switch(coluna)
    {
        case 0:
            return osProdutos[linha].getDescricao();
        case 1:
            return new Double(osProdutos[linha].getPreco());
            //tem que haver conversão para Double!
        case 2:
            if(osProdutos[linha].isEmPromocao())
                return "SIM";
            else
                return "não";
        default:
            return "-";// por via das dúvidas...
    }
}

/** Retorna o número de linhas (produtos) da tabela. 
 */
public int getRowCount()
{
    return osProdutos.length;       
}

/** Retorna o número de colunas da tabela
 */    
public int getColumnCount()
{
    return rotulosDasColunas.length;
}
/** Retorna o rótulo de cada coluna

*/

public String getColumnName(int i)

{

return rotulosDasColunas[i];

}

}

E aí vai um programinha mínimo para ver essa tabela:

public class MostraTabela

{

public static void main(String[] args)

{

JTable tabela = new JTable(obtemTabelaDeProdutos());

tabela.setRowHeight(20);

JScrollPane tela = new JScrollPane(tabela);

tela.setPreferredSize(new Dimension(300,100));

mostra(tela, Produtos da Loja);

}
//cria uma série de produtos para serem mostrados

//AQUI VOCÊ PODE FAZER UMA CONEXÃO COM O BANCO PARA

//OBTER OS REGISTROS DA SUA TABELA

private static ProdutoTableModel obtemTabelaDeProdutos()

{

Produto p1 = new Produto(arroz, 2.45f, false);

Produto p2 = new Produto(feijao, 1.99f, true);

Produto p3 = new Produto(macarrão, 1.56f, false);
return new ProdutoTableModel(new Produto[]{p1,p2,p3});    
    
}
//mostra o componente numa janela com o título dado

private static void mostra(Component comp,String titulo)

{

JFrame janela = new JFrame(titulo);

janela.getContentPane().add(comp);

janela.addWindowListener(

new WindowAdapter()

{

public void windowClosing(WindowEvent e)

{

System.exit(0);

}

});

janela.pack();

janela.setVisible(true);

}

}

Ah, falta implementar a classe Produto, mas essa é trivial, né não? :wink:

Criado 3 de fevereiro de 2005
Ultima resposta 3 de fev. de 2005
Respostas 2
Participantes 3