Assunto Batido. JTable

10 respostas
A

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.,

10 Respostas

Y

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

A

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

A

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:
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);
	}
	
	
}
Y

vc tem q setar seu tablemodel tb

SeuTableModel tableModel = new SeuTableModel();

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

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:

[img]https://www.dropbox.com/s/gc8n73ita24xhll/produtotablemodel.png[/img]
[url]https://www.dropbox.com/s/gc8n73ita24xhll/produtotablemodel.png[/url]

Na classe Principal:

[img]https://www.dropbox.com/s/410tw14lkm9vrym/principal.png[/img]
[url]https://www.dropbox.com/s/410tw14lkm9vrym/principal.png[/url]

Seguem os códigos:

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);
    }

}
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();
    
 
    //...
}
 }
A

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

1 Abraço,

Airton

Y

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

A

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…

A

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…

Y
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

Criado 19 de abril de 2013
Ultima resposta 20 de abr. de 2013
Respostas 10
Participantes 2