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.