Usando JTable

Bom tarde a todos,

Bom gente estou com um projeto da faculdade que é criar um controle de estoque, nele um determinado produto pode ter associado ao mesmo uma lista de lotes, gostaria de usar o Jtable para ficar esses dados na mesma tela, Lendo o forum li e achei alguns topicos falando com usar o JTable e o alerta avisando a não usar o DefaultTableModel, li esse topicos e acho que consegui entender o motivo, procurando como fazer o propio modelo de Table encontrei o topico:

http://www.guj.com.br/java/199067-redimensionar-jtable---pra-variar--resolvido-/2

Peguei o exemplo do amigo Marky.Vasconcelos li em sua pagina tb: http://markytechs.wordpress.com/2009/05/29/objecttablemodel/

Pesquisando mais ainda encontrei justamente o tópico onde ViniGodoy estava ensinando a como criar o proprio modelo http://www.guj.com.br/java/147521-inserir-dados-da-jtable-no-banco/3, copiei o codigo e tentei fazer algumas adptações para a minha situação porem nao obtive sucesso, gostaria se possivel pudessem me ajudar, creio eu que conseguindo entender como fazer para esse exemplo que eu utilizei conseguirei adptar para o meu controle de estoque.

Segue abaixo o que eu fiz:

Esse sistema em questao, cria um acervo de CD, cada cd possui um Artista, genero, titulo e ano, entao para testar o uso do JTable criei uma tela onde o usuario faz o cadastro dos generos, nessa mesma tela a Jtable seria para exibir os que ja estao cadastrado no banco.

Classe DAO - Classe de conecção

package conexao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class DAO {

		Connection con;
		
		PreparedStatement pstmt;
		
		ResultSet rs;
		
		public void getConexao()throws Exception{
	        String url = "jdbc:mysql://localhost:3306/sistemacd";
	        String user = "root";
	        String password = "";
	        Class.forName("com.mysql.jdbc.Driver");
	        con = DriverManager.getConnection(url, user, password);
		}
		
}

Classe CDDAO - Classe que consulta e retorna a lista de generos do Bancol, essa consulta SQL esta sendo usada tb no combobox da janela de cadastro de um novo cd

package conexao;

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

import modelo.CD;

public class CDDAO extends DAO{
	
	public List<CD> listaGenero() throws Exception {
		getConexao();
		String query = "SELECT * FROM genero ORDER BY descricao";
		pstmt = con.prepareStatement(query);
		rs = pstmt.executeQuery();
		CD c;
		List<CD> listaGen = new ArrayList<CD>();
		while (rs.next()){
			c = new CD();
			c.setGenero(rs.getString("descricao"));
			listaGen.add(c);
		}
		return listaGen;
	}

}

Classe Objeto - Tem o objeto CD e os dados que são manipulados nele

[code]
package modelo;

public class CD {

private String nome;
private String titulo;
private String ano;
private String genero;

public CD(){
	
}

public CD(String nome, String titulo, String ano, String genero) {
	this.nome = nome;
	this.titulo = titulo;
	this.ano = ano;
	this.genero = genero;
}

public String getNome() {
	return nome;
}

public String getTitulo() {
	return titulo;
}

public String getAno() {
	return ano;
}

public String getGenero() {
	return genero;
}

public void setNome(String nome) {
	this.nome = nome;
}

public void setTitulo(String titulo) {
	this.titulo = titulo;
}

public void setAno(String ano) {
	this.ano = ano;
}

public void setGenero(String genero) {
	this.genero = genero;
}

}[/code]

Classe Genero - Janela de cadastro do Genero

[code]
package visual;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JTable;

public class Genero extends JFrame {

private JPanel contentPane;
private JTextField txtgenero;
private JTable table;

/**
 * Launch the application.
 */
public static void main(String[] args) {
	EventQueue.invokeLater(new Runnable() {
		public void run() {
			try {
				Genero frame = new Genero();
				frame.setVisible(true);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	});
}

/**
 * Create the frame.
 */
public Genero() {
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setBounds(100, 100, 450, 300);
	contentPane = new JPanel();
	contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
	setContentPane(contentPane);
	contentPane.setLayout(null);
	
	JLabel lblGenero = new JLabel("Genero");
	lblGenero.setBounds(29, 40, 46, 14);
	contentPane.add(lblGenero);
	
	txtgenero = new JTextField();
	txtgenero.setBounds(85, 37, 86, 20);
	contentPane.add(txtgenero);
	txtgenero.setColumns(10);
	
	table = new JTable();
	table.setBounds(40, 96, 304, 136);
	contentPane.add(table);
}

}[/code]

E Finalmente o Modelo da Jtable

[code]
package visual;

import java.util.Collections;
import java.util.List;

import javax.swing.table.AbstractTableModel;

import modelo.CD;

public class GeneroTableModel extends AbstractTableModel {

//Constantes para colunas
private static final int COL_DESCRICAO = 0;

private List<CD> valores; //Lista de Generos para exibir

//Contrutor que recebe a lista de generos
public GeneroTableModel(Collections<CD> valores){
	this.valores = new ArrayList<CD>(valores);
}

public int getRowCount(){
	//Quantas linhas tem a tabela? Uma para cada item da lista.
	return valores.size();
}

public int getColumnCount(){
	//Quantas colunas tem a tabela? No meu caso 1.
	return 1;
}

public String getColumnName(int columnIndex){
	//Qual é o nome das nossas colunas? Isso aparecerá no cabeçalho
	if (columnIndex == COL_DESCRICAO) return "Descição";
}

public Object getValueAt(int row, int column){
    //Precisamos retornar o valor da coluna column e da linha row.   
    //O JTable chama esse método quando precisa desenhar uma célula. E só ele deve chama-lo.   
    //Você usará um método muito mais conveniente, chamado getProduto() 
	CD cd = valores.get(row);
	if(column == COL_DESCRICAO) cd.getGenero();
}

//Você deve implementar o setValueAt se sua tabela for editável.   
//Nesse exemplo, vou deixar alterar só a quantidade.
public void setValueAt(Object aValue, int rowIndex, int columnIndex){
	try {
		if(columnIndex == COL_DESCRICAO) valores.get(rowIndex).setGenero(aValue.toString());
	} catch (Exception e) {
           //Em caso de exceção, deixo o produto inalterado. Isso fará com que os valores antigos sejam desenhados.   
           //Pode ocorrer caso o usuário digite uma letra na quantidade, por exemplo. 
	}
}

public Class getColumnClass(int columnIndex){
    //Qual a classe das nossas colunas?
	if (columnIndex == COL_DESCRICAO) return String.class;
	//As demais são double (No meu caso nesse exemplo não existe mais nenhuma
	return null;
}

public boolean isCellEditable(int rowIndex, int columnIndex){
	//Indicamos se a célula da rowIndex e da columnIndex é editável. Somente a quantidade (Genero) é editavel nesse exemplo   
	return columnIndex == COL_DESCRICAO;
}

//Já que esse tableModel é de produtos, vamos fazer um get que retorne um produto inteiro.   
//Isso elimina a necessidade de chamar o getValueAt() nas telas.
public CD get(int row){
	return valores.get(row);
}

// --- Já respondemos ao Swing o que ele queria saber. Agora é hora de adicionar métodos para nós mesmo. :)   
//Esse método permite adicionar um produto na JTable

public void add(CD cd){
	//Adicionamos o produto
	valores.add(cd);
	//Avisamos a table para que redesenhe a linha
	fireTableRowsInserted(valores.size()-1, valores.size()-1);
}

public List<CD> getCds(){
	return Collections.unmodifiableList(valores);
}

}[/code]

A linhas que estão com erro na classe de modelo são:

	public GeneroTableModel([u]Collections[/u]<CD> valores){ //Mensagem: The type Collections is not generic; it cannot be parameterized with arguments <CD>
		this.valores = [u]new ArrayList<CD>(valores); [/u]//Mensagem: ArrayList<CD> cannot be resolved to a type
                }


	public String [u]getColumnName(int columnIndex){[/u] //Mensagem: This method must return a result of type String ele Apresenta como opção: Add Result Statement ou Change o return type para Void
		//Qual é o nome das nossas colunas? Isso aparecerá no cabeçalho
		if (columnIndex == COL_DESCRICAO) return "Descição";
	}

                public Object [u]getValueAt(int row, int column){[/u] Mesma mensagem do metodo anterior
                                  //Precisamos retornar o valor da coluna column e da linha row.   
                                  //O JTable chama esse método quando precisa desenhar uma célula. E só ele deve chama-lo.   
                                 //Você usará um método muito mais conveniente, chamado getProduto() 
		CD cd = valores.get(row);
		if(column == COL_DESCRICAO) cd.getGenero();
	}

PS: O que esta subilinhando é o que aparece em vermelho aqui no Eclipse

Será que seria possivel você me falarem o direcionamento correto para resolver isso?

Desde já agradeço toda ajuda possivel.

Cara, Collection[u]s[/u] é completamente diferente de Collecti[u]on[/u]. Collections é um conjunto de utilitários para mexer com “Collection” s : dá pra dar Sort, busca binária…

E no seu getColumnName, você não está retornando um valor ou lançando uma exceção para outras situações. Se o columnIndex não for COL_DESCRICAO ele não retorna.

E o ArrayList, faltou importar a classe…

No geral, olhando beeem por cima, você tá fazendo certo… São só esses errinhos aí… boa sorte.

Valeu amigo, Corrigir o erro no Collection e do ArrayList erro de digitação. Falta de antenção mesmo. So que os outros dois não entendi o que você falou, esse modelo quem criou foi ViniGodoy nesse tópico http://www.guj.com.br/java/147521-inserir-dados-da-jtable-no-banco/3, o metodo ta igual como está la, não consegui entender como resolver.

Veja esse, um modelo que uso. ver se consegue entender.

package br.com.estoque.cadastro;  
  
import java.util.ArrayList;  
import java.util.Date;  
import java.util.List;  
  
import javax.swing.table.AbstractTableModel;  
  
import br.com.estoque.bean.Cidade;  
    
/**  
* Implementação de Table Model para exibir as Cidades.  
*   
* @author Fernando Evangelista 
*/    
public class ContatoTableModel extends AbstractTableModel {    
    
    /* Lista de Cidades que representam as linhas. */    
    private List<Cidade> linhas;    
    
    /* Array de Strings com o nome das colunas. */    
    private String[] colunas = new String[] {    
            "Código", "Nome", "Uf"};    
    
    
    /* Cria um SocioTableModel vazio. */    
    public ContatoTableModel() {    
        linhas = new ArrayList<Cidade>();    
    }    
    
    /* Cria um SocioTableModel carregado com  
     * a lista de cidade especificada. */    
    public ContatoTableModel(List<Cidade> listaDeSocios) {    
        linhas = new ArrayList<Cidade>(listaDeSocios);    
    }    
    
    
    /* Retorna a quantidade de colunas. */    
    @Override    
    public int getColumnCount() {    
        // Está retornando o tamanho do array "colunas".    
        // Mas como o array é fixo, vai sempre retornar 4.    
        return colunas.length;    
    }    
    
    /* Retorna a quantidade de linhas. */    
    @Override    
    public int getRowCount() {    
        // Retorna o tamanho da lista de sócios.    
        return linhas.size();    
    }    
    
    /* Retorna o nome da coluna no índice especificado.  
     * Este método é usado pela JTable para saber o texto do cabeçalho. */    
    @Override    
    public String getColumnName(int columnIndex) {    
        // Retorna o conteúdo do Array que possui o nome das colunas    
        // no índice especificado.    
        return colunas[columnIndex];    
    };    
    
    /* Retorna a classe dos elementos da coluna especificada.  
     * Este método é usado pela JTable na hora de definir o editor da célula. */    
    @Override    
    public Class<?> getColumnClass(int columnIndex) {    
        // Retorna a classe referente a coluna especificada.    
        // Aqui é feito um switch para verificar qual é a coluna    
        // e retornar o tipo adequado. As colunas são as mesmas    
        // que foram especificadas no array "colunas".    
        switch (columnIndex) {    
        case 0: // Primeira coluna é o codigo, que é um Interger.    
            return Integer.class;    
        case 1: // Segunda coluna é o nome, que também é uma String..    
            return String.class;    
        case 2: // Terceira coluna é uf,   
            return String.class;  
        default:    
            // Se o índice da coluna não for válido, lança um    
            // IndexOutOfBoundsException (Exceção de índice fora dos limites).    
            // Não foi necessário verificar se o índice da linha é inválido,    
            // pois o próprio ArrayList lança a exceção caso seja inválido.    
            throw new IndexOutOfBoundsException("columnIndex out of bounds");    
        }    
    }    
    
    /* Retorna o valor da célula especificada  
     * pelos índices da linha e da coluna. */    
    @Override    
    public Object getValueAt(int rowIndex, int columnIndex) {    
        // Pega a cidade da linha especificada.    
        Cidade cidade = linhas.get(rowIndex);    
    
        // Retorna o campo referente a coluna especificada.    
        // Aqui é feito um switch para verificar qual é a coluna    
        // e retornar o campo adequado. As colunas são as mesmas    
        // que foram especificadas no array "colunas".    
        switch (columnIndex) {    
        case 0: // Primeira coluna é o nome.    
            return cidade.getCodigo();    
        case 1: // primeira coluna é o Codigo.    
            return cidade.getNome();    
        case 2: // segunda coluna é a nome.    
            return cidade.getUf();    
                // terceira coluna é a Uf.    
        default:    
            // Se o índice da coluna não for válido, lança um    
            // IndexOutOfBoundsException (Exceção de índice fora dos limites).    
            // Não foi necessário verificar se o índice da linha é inválido,    
            // pois o próprio ArrayList lança a exceção caso seja inválido.    
            throw new IndexOutOfBoundsException("columnIndex out of bounds");    
        }    
    }    
    
    /* Seta o valor da célula especificada  
     * pelos índices da linha e da coluna.  
     * Aqui ele está implementado para não fazer nada,  
     * até porque este table model não é editável. */    
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {};    
    
    /* Retorna um valor booleano que define se a célula em questão  
     * pode ser editada ou não.  
     * Este método é utilizado pela JTable na hora de definir o editor da célula.  
     * Neste caso, estará sempre retornando false, não permitindo que nenhuma  
     * célula seja editada. */    
    @Override    
    public boolean isCellEditable(int rowIndex, int columnIndex) {    
        return false;    
    }    
    
    
    ////////////////////////////////////////////////////////////    
    // Os métodos declarados até aqui foram as implementações //    
    // de TableModel, que são continuamente utilizados        //    
    // pela JTable para definir seu comportamento,            //    
    // por isso o nome Table Model (Modelo da Tabela).        //    
    //                                                        //    
    // A partir de agora, os métodos criados serão            //    
    // particulares desta classe. Eles serão úteis            //    
    // em algumas situações.                                  //    
    ////////////////////////////////////////////////////////////    
    
    
    /* Retorna a cidade da linha especificada. */    
    public Cidade getCidade(int indiceLinha) {    
        return linhas.get(indiceLinha);    
    }    
        
    /* Adiciona um registro. */    
    public void addSocio(Cidade cidade) {    
        // Adiciona o registro.    
        linhas.add(cidade);    
    
        // Pega a quantidade de registros e subtrai um para achar    
        // o último índice. É preciso subtrair um, pois os índices    
        // começam pelo zero.    
        int ultimoIndice = getRowCount() - 1;    
    
        // Reporta a mudança. O JTable recebe a notificação    
        // e se redesenha permitindo que visualizemos a atualização.    
        fireTableRowsInserted(ultimoIndice, ultimoIndice);    
    }    
    
    /* Remove a linha especificada. */    
    public void removeCidade(int indiceLinha) {    
        // Remove o cidade da linha especificada.            
        linhas.remove(indiceLinha);    
    
        // Reporta a mudança. O JTable recebe a notificação    
        // e se redesenha permitindo que visualizemos a atualização.    
        fireTableRowsDeleted(indiceLinha, indiceLinha);    
    }    
    
    /* Adiciona uma lista de cidade ao final dos registros. */    
    public void addListaDeCidade(List<Cidade> cidade) {    
        // Pega o tamanho antigo da tabela.    
        int tamanhoAntigo = getRowCount();    
    
        // Adiciona os registros.    
        linhas.addAll(cidade);    
    
        // Reporta a mudança. O JTable recebe a notificação    
        // e se redesenha permitindo que visualizemos a atualização.    
        fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1);    
    }    
    
    /* Remove todos os registros. */    
    public void limpar() {    
        // Remove todos os elementos da lista de sócios.    
        linhas.clear();    
    
        // Reporta a mudança. O JTable recebe a notificação    
        // e se redesenha permitindo que visualizemos a atualização.    
        fireTableDataChanged();    
    }    
    
    /* Verifica se este table model está vazio. */    
    public boolean isEmpty() {    
        return linhas.isEmpty();    
    }    
    
}    

E chame assim:

public void startTable(){  
        List<Cidade> lista = conn.executeSQl();  
        ContatoTableModel model = new ContatoTableModel(lista);  
        jtTabela.setModel(model);  
    }  

Vc pode iniciar esse metodo no construtor da sua view, assim ele pode exibir os registros quando abrir a sua view.

Boa sorte.

@Fexx

Tentei fazer usando o seu modelo mais não deu certo!! Não entendi na parte que você fala sobre como usar o modelo!! Seria possível explicar melhor?

Não to conseguindo adaptar para minha situação, acho que meu problema é mais de comando do java. Observe que minha classe conexão e separada da que tem a instrução sql da consulta.

Não da para saber quais linhas estão com erro assim, tente isolar o erro e nos mostrar.

PS: Se fosse usar o ObjectTableModel voce nao precisaria criar nenhum outro TableModel.

Já tentou usar o SwingBean? http://swingbean.sf.net

-> Vai fazer as tabelas e formulários de forma bem mais simples!

Bom galera, fiz as modificações usando o exemplo, porém ele não esta retornando a lista com os campos do banco, sei que esta faltando ele fazer a busca mas eu não sei onde implementar a consulta sql para que ele retorne os valores.

O código da janela ta assim:

package visual;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JTable;

import modelo.CD;

import conexao.CDDAO;

public class Genero extends JFrame {

	private JPanel contentPane;
	private JTextField txtgenero;
	private JTable table;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Genero frame = new Genero();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Genero() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JLabel lblGenero = new JLabel("Genero");
		lblGenero.setBounds(29, 40, 46, 14);
		contentPane.add(lblGenero);
		
		txtgenero = new JTextField();
		txtgenero.setBounds(85, 37, 86, 20);
		contentPane.add(txtgenero);
		txtgenero.setColumns(10);
		
		table = new JTable();
		//List<CD> cd = CDDAO;
		//table.setModel(new GeneroTableModel(cd));
		table.setModel(new GeneroTableModel(new ArrayList<CD>()));
		table.setBounds(40, 96, 304, 136);
		contentPane.add(table);
	}
}

O código que chama o modelo no JTable ta assim:

table = new JTable(); //List<CD> cd = CDDAO; //table.setModel(new GeneroTableModel(cd)); table.setModel(new GeneroTableModel(new ArrayList<CD>())); table.setBounds(40, 96, 304, 136); contentPane.add(table);

E o código do modelo esta assim:


package visual;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

import javax.swing.table.AbstractTableModel;

import modelo.CD;

public class GeneroTableModel extends AbstractTableModel {
	
	//Constantes para colunas
	private static final int COL_DESCRICAO = 0;
	
	private List<CD> valores;//Lista de Generos para exibir

	//Contrutor que recebe a lista de generos
	public GeneroTableModel(Collection<CD> valores){
		this.valores = new ArrayList<CD>(valores);
	}
	
	public int getRowCount(){
		//Quantas linhas tem a tabela? Uma para cada item da lista.
		return valores.size();
	}
	
	public int getColumnCount(){
		//Quantas colunas tem a tabela? No meu caso 1.
		return 1;
	}
	
	public String getColumnName(int columnIndex){
		//Qual é o nome das nossas colunas? Isso aparecerá no cabeçalho
		if (columnIndex == COL_DESCRICAO) return "Descrição";
		
		return null;
	}
	
	public Object getValueAt(int row, int column){
        //Precisamos retornar o valor da coluna column e da linha row.   
        //O JTable chama esse método quando precisa desenhar uma célula. E só ele deve chama-lo.   
        //Você usará um método muito mais conveniente, chamado getProduto() 
		CD cd = valores.get(row);
		if(column == COL_DESCRICAO) cd.getGenero();
		
		return null;
	}
	
    //Você deve implementar o setValueAt se sua tabela for editável.   
    //Nesse exemplo, vou deixar alterar só a quantidade.
	public void setValueAt(Object aValue, int rowIndex, int columnIndex){
		try {
			if(columnIndex == COL_DESCRICAO) valores.get(rowIndex).setGenero(aValue.toString());
		} catch (Exception e) {
	           //Em caso de exceção, deixo o produto inalterado. Isso fará com que os valores antigos sejam desenhados.   
	           //Pode ocorrer caso o usuário digite uma letra na quantidade, por exemplo. 
		}
	}
	
	public Class getColumnClass(int columnIndex){
        //Qual a classe das nossas colunas?
		if (columnIndex == COL_DESCRICAO) return String.class;
		//As demais são double (No meu caso nesse exemplo não existe mais nenhuma
		return null;
	}
	
	public boolean isCellEditable(int rowIndex, int columnIndex){
		//Indicamos se a célula da rowIndex e da columnIndex é editável. Somente a quantidade (Genero) é editavel nesse exemplo   
		return columnIndex == COL_DESCRICAO;
	}
    
	//Já que esse tableModel é de produtos, vamos fazer um get que retorne um produto inteiro.   
    //Isso elimina a necessidade de chamar o getValueAt() nas telas.
	public CD get(int row){
		return valores.get(row);
	}
	
    // --- Já respondemos ao Swing o que ele queria saber. Agora é hora de adicionar métodos para nós mesmo. :)   
    //Esse método permite adicionar um produto na JTable
	
	public void add(CD cd){
		//Adicionamos o produto
		valores.add(cd);
		//Avisamos a table para que redesenhe a linha
		fireTableRowsInserted(valores.size()-1, valores.size()-1);
	}
	
	public List<CD> getCds(){
		return Collections.unmodifiableList(valores);
	}
	
}

O problema está em: Que não sei como fazer para fazer o JTable buscar os dados no Banco de Dados.

Tentei fazer assim:

private List valores = CDDAO.listaGenero();

Sei que não é o certo pq fica cheio de erros dizendo que tenho que mudar os métodos para Static.

@Guerr@
Meu brother vi o link, estou olhando para ver se consigo fazer por ele, desde já agradeço pela dica.

@All
Vlws, pelo o suporte.

O que você está tentando fazer a princípio não está errado, tem que ver é o que você está fazendo com o código do CDDAO… Por exemplo, será que você está misturando métodos não estáticos em uma chamada static? Será que a chamada deveria ser algo como

private List<CD> valores = (new CDDAO()).listaGenero();

?

Bom, amigo acho que realmente o problema pode ser isso, olha a classe CDDAO

[code]package conexao;

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

import modelo.CD;

public class CDDAO extends DAO{

public static List<CD> listaGenero() throws Exception {
	getConexao();
	String query = "SELECT * FROM genero ORDER BY descricao";
	pstmt = con.prepareStatement(query);
	rs = pstmt.executeQuery();
	CD c;
	List<CD> listaGen = new ArrayList<CD>();
	while (rs.next()){
		c = new CD();
		c.setGenero(rs.getString("descricao"));
		listaGen.add(c);
	}
	return listaGen;
}

}[/code]

Ele ta como Static

Removi o Static coloquei a linha que você me informou só que é exibida esse erro.


Carinha, isso é problema clássico de java, que é tratamento de exceções. O seu DAO pode lançar exceções da classe Exception. Toda classe java tem que tratar ou lançar as exceções que são declaradas nos métodos, como é no caso do seu Dao.
public List listaGenero() throws Exception

Então, se você for usar o método, você tem que tratar a exceção, ou declarar que seu método lança a exceção também.

exemplo:
List bla=null;
try {
bla = (new SuaClasseAqui()).listaGenero();
} catch(Exception ex) {
// o que acontece se você não conseguir listar os gêneros? Mostra uma mensagem para o usuário? Ignora?
}

Não consegui adcionar o Try cath para fazer o controle da exception quando é apresentado um erro que falta um } para fechar o metodo. Estou vendo se consigo usar o SwingBean

Bom galera, usei o swingbean peguei os exemplos no site para entender, to conseguindo ao poucos fazer alguma coisa, mais como o trabalho do sistema é para a próxima semana não tenho como ficar esperando entender como funcionar corretamente. Então vou usar telas separada para fazer ambos cadastramentos, depois vou ver se estudo mais para conseguir fazer o que eu pretendia.

Desde já agradeço a todos que me ajudaram e me passaram conteúdo para eu conseguir aprender.

[quote=The Rogue]Bom galera, usei o swingbean peguei os exemplos no site para entender, to conseguindo ao poucos fazer alguma coisa, mais como o trabalho do sistema é para a próxima semana não tenho como ficar esperando entender como funcionar corretamente. Então vou usar telas separada para fazer ambos cadastramentos, depois vou ver se estudo mais para conseguir fazer o que eu pretendia.

Desde já agradeço a todos que me ajudaram e me passaram conteúdo para eu conseguir aprender.[/quote]

Se tiver alguma dificuldade com o SwingBean, mande um mensagem aqui que tento ajudar!