Assunto Batido. JTable

Pessoal,
de boa, não aguento mais correr atrás de um tutorial COMPLETO e o mais simples possível para criação de um JTable utilizando AbstractTableModel. Antes que me alertem, sei que no GUJ tem um tutorial imenso falando a respeito, e outros vários, mas eu simplesmente não consegui implementar – por falha minha – e peço a ajuda de quem possa estar disposto.
Se o exemplo contemplar o conteúdo para alimentar a tabela de um resultset de duas linhas (idCliente, Cliente) já estará ótimo.
Por favor, me ajudem.

Att.,

http://www.javasimples.com.br/swing-awt/death-to-defaulttablemodel-abstracttablemodel-rulez

da uma olhada neste link ai e diz q vc n conseguiu fazer e posta aqui teu codigo xD

tenta manter em mente que ali vc vai manipular uma lista de objetos, cada propriedade deste objeto vais er uma coluna, e cada indice vai ser uma linha

Estou utilizando o WindowBuilder para criar. Criei, porém a JTable que eu adicionei não mostra os nomes das colunas nem o grid, apesar de eu checar a caixa da opção. Veja:

https://www.dropbox.com/s/kyf0f7uxjrl9kuh/Screen%20Shot%202013-04-19%20at%2010.09.08%20AM.png

Consegui colocar manualmente (JTable), dentro de um JScrollPane, mas ainda não consegui fazer aparecer o nome das colunas e o grid, como está no seu exemplo.

Veja meu código:

[code]import java.awt.EventQueue;
import java.awt.Rectangle;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.EmptyBorder;

public class Tabela extends JFrame {

private JPanel contentPane;
private JTable table;
private JScrollPane jScrollPane;

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

/**
 * Create the frame.
 */
public Tabela() {
	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);
	
	table = new JTable();
	table.setBounds(23, 18, 400, 175);
	
	
	jScrollPane = new JScrollPane();
	jScrollPane.setBounds(new Rectangle(23, 18, 400, 175));
	jScrollPane.setViewportView(table);
	contentPane.add(jScrollPane);
	
	
	JButton btnNewButton = new JButton("Inserir");
	btnNewButton.setBounds(6, 205, 117, 29);
	contentPane.add(btnNewButton);
	
	JButton btnNewButton_1 = new JButton("Excluir");
	btnNewButton_1.setBounds(162, 205, 117, 29);
	contentPane.add(btnNewButton_1);
	
	JButton btnNewButton_2 = new JButton("Misturar");
	btnNewButton_2.setBounds(327, 205, 117, 29);
	contentPane.add(btnNewButton_2);
	
	JButton btnNewButton_3 = new JButton("Ordenar por quantidade");
	btnNewButton_3.setBounds(23, 243, 183, 29);
	contentPane.add(btnNewButton_3);
	
	JButton btnNewButton_4 = new JButton("Ordenar por nome");
	btnNewButton_4.setBounds(251, 243, 172, 29);
	contentPane.add(btnNewButton_4);
}

}
[/code]

vc tem q setar seu tablemodel tb

SeuTableModel tableModel = new SeuTableModel();

table = new JTable();  
table.setBounds(23, 18, 400, 175); 
 
table.setModel(tableModel);

Outro problema:

Criei todas as classes do site que me enviou, porém tive alguns erros. Obrigado por me ajudar. Quem sabe agora vai…

Na classe ProdutoTableModel:


https://www.dropbox.com/s/gc8n73ita24xhll/produtotablemodel.png

Na classe Principal:


https://www.dropbox.com/s/410tw14lkm9vrym/principal.png

Seguem os códigos:

[code]import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.swing.table.AbstractTableModel;

public class ProdutoTableModel extends AbstractTableModel {

private final int COL_NOME = 0;
private final int COL_QUANT = 1;

private List<Produto> produtos;

public ProdutoTableModel() {
    produtos = new ArrayList();
}

public ProdutoTableModel(List<Produto> lista) {
    this();
    produtos.addAll(lista);
}

@Override
public String getColumnName(int column) {
    //qual o nome da coluna
    if (column == COL_NOME) {
        return "Nome";
    } else if (column == COL_QUANT) {
        return "Quant. Disp";
    }
    return "";
}

@Override
public Class getColumnClass(int columnIndex) {
    //retorna a classe que representa a coluna
    if (columnIndex == COL_NOME) {
        return String.class;
    } else if (columnIndex == COL_QUANT) {
        return Integer.class;
    }
    return String.class;
}

@Override
public int getColumnCount() {
	// TODO Auto-generated method stub
	return 2;
}

@Override
public int getRowCount() {
	// TODO Auto-generated method stub
	return produtos.size();
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    //pega o produto da linha
    Produto p = produtos.get(rowIndex);

    //verifica qual valor deve ser retornado
    if (columnIndex == COL_NOME) {
        return p.getNome();
    } else if (columnIndex == COL_QUANT) {
        return p.getQuant();
    }
    return "";
}

@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    //pega o produto da linha
    Produto p = produtos.get(rowIndex);

    //verifica qual valor vai ser alterado
    if (columnIndex == COL_NOME) {
        p.setNome(aValue.toString());
    } else if (columnIndex == COL_QUANT) {
        p.setQuant(Integer.parseInt(aValue.toString()));
    }

    //avisa que os dados mudaram
    fireTableDataChanged();
}

@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
    //no nosso caso todas vão ser editáveis, entao retorna true pra todas
    return true;
}

public void inserir(Produto p) {
    produtos.add(p);

    fireTableDataChanged();
}

public void excluir(int pos) {
    produtos.remove(pos);

    fireTableDataChanged();
}

public void excluir(Produto p) {
    produtos.remove(p);

    fireTableDataChanged();
}

public void ordenarPorNome() {
    //ordena pelo nome
    Collections.sort(produtos, new Comparator<produto>() {

        public int compare(Produto o1, Produto o2) {
            return o1.getNome().compareTo(o2.getNome());
        }
    });

    //avisa que a tabela foi alterada
    fireTableDataChanged();
}

public void ordenarPorQuantidade() {
    //ordena pelo nome
    Collections.sort(produtos, new Comparator<produto>() {

        public int compare(Produto o1, Produto o2) {
            return o1.getQuant() - o2.getQuant();
        }
    });

    //avisa que a tabela foi alterada
    fireTableDataChanged();
}

public void misturar() {
    //mistura a lista
    Collections.shuffle(produtos);

    //avisa que a tabela foi alterada
    fireTableDataChanged();
}

public Produto getProduto(int pos) {
    if (pos < 0 || pos >= produtos.size()) {
        return null;
    }

    return produtos.get(pos);
}

}
[/code]

[code]import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Principal extends JFrame {

private ProdutoTableModel model;


//variável só para controlar os códigos dos produtos
private int ultimoCod;

public Principal() {
	
	Tabela frame = new Tabela();
    
   // initComponents();
    ultimoCod = 1;

    //cria a lista com os produtos
    List<Produto> lista = new ArrayList<Produto>();
    lista.add(new Produto(ultimoCod++,"Lapiseira 0.7",30));
    lista.add(new Produto(ultimoCod++,"Caneta preta",100));
    lista.add(new Produto(ultimoCod++,"Caneta azul",70));
    lista.add(new Produto(ultimoCod++,"Caneta vermelha",100));

    //cria o modelo de Produto
    model = new ProdutoTableModel(lista);

    //atribui o modelo à tabela
    
    frame.setModel(model);
}

//Ação do botão Inserir
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    Random r = new Random();
    Produto p = new Produto(ultimoCod++, "Produto "+String.valueOf(r.nextInt(100)), r.nextInt(1000));
    model.inserir(p);
}

//Ação do botão Excluir
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
    int selecionados[] = frame.getSelectedRows();
    if (selecionados.length > 0){
        List<Produto> seraoExcluidos = new ArrayList<Produto>();

        for (int i=0; i<selecionados.length; i++)
            seraoExcluidos.add(model.getCliente(selecionados[i]));

        for (Produto p : seraoExcluidos)
            model.excluir(p);
    }else{
        JOptionPane.showMessageDialog(this, "Selecione alguém neh...");
    }
}

//Ação do botão Ordenar por Quantidade
private void btnNewButton_3ActionPerformed(java.awt.event.ActionEvent evt) {
model.ordenarPorQuantidade();
}

//Ação do botão Ordenar por Nome
private void btnNewButton_4ActionPerformed(java.awt.event.ActionEvent evt) {
model.ordenarPorNome();
}

private void btnNewButton_2ActionPerformed(java.awt.event.ActionEvent evt) {
    model.misturar();


//...

}
}[/code]

Porque será que não estou conseguindo colocar as imagens para serem carregadas? Vc sabe?

1 Abraço,

Airton

sei n cara, posta quais os erros e em quais linhas acontecem

Linha 52: The method getCliente(int) is undefined for the type ProdutoTableModel.

Linha 47: frame cannot be resolved

Os erros acima são somente da classe Principal. Da outra classe eu resolvi.

Me parece que o método .getSelectedRows() não existe na classe Tabela que eu criei, e a mesma coisa para o método .getCliente(int).

Mas não vi esta instrução no site…

Eu descobri que o método .getSelectedRows(); pertence à tabela JTable, cujo objeto é table, e não à classe Tabela.
Substituí frame por table, e como não havia referência ao objeto, criei um setter dentro de Principal para receber a referência do objeto table da classe Tabela, que é o meu form.

mas o .getCliente() não tenho idéia de onde seja…

for (int i=0; i<selecionados.length; i++)  
                seraoExcluidos.add(model.getCliente(selecionados[i]));  

ali vc ta chamando um metodo getCliente q n ta definido no seu table model, nessa parte vc ta tentando excluir os selecionados, entao tem q fazer na sua table model um metodo q te retorne uma List com os objetos q estao selecionados na tabela sacou?

qlqr duvida posta ai xD