Para facilitar o seu entendimento, montei exatamente o mesmo exemplo que você tentou criar ali em cima, mas usando o TableModel de maneira correta.
Não se assuste com o tamanho do código. Está super comentado.
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
//Primeiro passo, definimos a nossa classe de negócio. No seu caso, Cliente
class Cliente {
private String nome;
private String endereco;
private String telefone;
public Cliente(String nome, String endereco, String telefone) {
this.nome = nome;
this.telefone = telefone;
this.endereco = endereco;
}
public String getNome() {
return nome;
}
public String getEndereco() {
return endereco;
}
public String getTelefone() {
return telefone;
}
}
// Segundo passo, criamos um TableModel, que diz ao Swing como essa classe
// deve aparecer numa JTable.
// Note que essa classe apenas descreve para o Swing como os dados, da classe de
// cima, devem ser mostrados. Até agora, nada foi desenhado na tela ainda.
class ClienteTableModel extends AbstractTableModel {
// Esse model mostrará uma lista de clientes, em forma de tabela.
// Aqui está nossa lista:
private List<Cliente> clientes;
/**
* Esse construtor inicializa a lista que será exibida com uma lista
* externa.
*/
public ClienteTableModel(List<Cliente> clientes) {
this.clientes = new ArrayList<Cliente>(clientes);
}
/**
* Nesse método, retornamos o número de colunas que a tabela terá. Neste
* caso, são 3: Nome, endereço e telefone
* */
@Override
public int getColumnCount() {
return 3;
}
/**
* Aqui, dizemos para o swing o título de cada coluna. Nossa coluna 0 terá o
* título Nome. A 1 o Endereço e a 2 o Telefone.
*/
@Override
public String getColumnName(int column) {
return new String[] { "Nome", "Endereço", "Telefone" }[column];
}
/**
* Nossa tabela terá uma linha para cada cliente na lista. Por isso, a
* quantidade de linhas será idêntica ao tamanho da lista de clientes que
* estamos exibindo.
*/
@Override
public int getRowCount() {
return clientes.size();
}
/**
* Nesse método, o swing nos indica uma linha e uma coluna da tabela, e
* devemos retornar o valor que queremos naquela linha/coluna.
*/
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
// Aqui, devolveremos o nome, endereço o telefone de acordo com a coluna
// informada em columnIndex. A linha será correspondente a linha do
// cliente na lista.
if (columnIndex == 0) // Coluna 0 é a de Nome
return clientes.get(rowIndex).getNome();
else if (columnIndex == 1) // Coluna 1 é a de Endereço
return clientes.get(rowIndex).getEndereco();
else if (columnIndex == 2) // Coluna 2 é a de Telefone
return clientes.get(rowIndex).getNome();
// Essa exceção nunca irá ocorrer.
throw new IllegalArgumentException("Linha " + rowIndex + " e coluna "
+ columnIndex + " não são válidas!");
}
// Criamos um método conveniente para retornar um cliente baseado na linha.
public Cliente get(int linha) {
return clientes.get(linha);
}
}
/**
* Exatamente o mesmo JFrame que você montou. Note que, como temos um model
* próprio, aqui só trabalhamos com nossa classe de negócios, Cliente. Não
* usamos aqui listas de strings, arrays de objetos ou qualquer outra coisa
* tenebrosa do gênero.
* <p>
* Embora esse código pareça mais longo e difícil que o seu, saiba que na
* prática, você terá mesmo que criar uma classe Cliente, provavelmente já terá
* a lista de clientes vinda de algum lugar (como um banco de dados). E a única
* coisa que será refeita será o model, que poderá ser reaproveitado em todas as
* telas que tiverem uma tabela de clientes.
*/
public class ExemploJTable extends JFrame {
private JTable tabela;
private ClienteTableModel model;
private JButton btn;
public ExemploJTable() {
List<Cliente> clientes = new ArrayList<Cliente>();
clientes.add(new Cliente("João", "Rua Tal", "4444"));
clientes.add(new Cliente("Maria", "Av Tal", "3333"));
model = new ClienteTableModel(clientes);
tabela = new JTable(model);
JScrollPane sp = new JScrollPane(tabela);
add(sp, "Center");
btn = new JButton("Mostrar");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
mostrarSelecionado();
}
});
add(btn, "South");
setSize(600, 600);
setLocationRelativeTo(null);
setVisible(true);
}
protected void mostrarSelecionado() {
// Mostra o nome e o telefone dos clientes selecionados.
for (int linha : tabela.getSelectedRows()) {
Cliente selecionado = model.get(linha);
JOptionPane.showMessageDialog(null, selecionado.getNome() + " - "
+ selecionado.getTelefone());
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable()
{
@Override
public void run() {
new ExemploJTable().setVisible(true);
}
});
}
}