Passar linhas selecionadas de uma jtable para outra da mesma tela

5 respostas
S

Boa noite como o proprio topico ja diz tudo tenho em um form 2 jtables uma em cima da outra e precisava de algum exemplo por gentileza de um form que passa as linhas selecionadas de uma jtable e se eu clicar no botao ele cai na 2jtable, se eu nao me expressei bem pode falar que eu reformulo minha duvida vlw pela atencao.

5 Respostas

FPaschoal

Opa, vamos lá…
Acredito que você quer algo parecido com a imagem que eu anexei, já fiz algo parecido, vou postar o código para jogar da tabela da esquerda (tabelaOrigem) para a direita (tabelaDestino) e espero que te de uma idéia de como fazer para o que você precisa.

if (tabelaOrigem.getSelectedRowCount()!=0){ //Verifica se existe linha selecionada para não dar erro na hora de pegar os valores

	//Pega os models das listas, para fazer as inserções e remoções
	DefaultTableModel modelOrigem = (DefaultTableModel) tabelaOrigem.getModel();
	DefaultTableModel modelDestino = (DefaultTableModel) tabelalDestino.getModel();

	//Cria uma linha para ser incluida na tabela de destino, no meu caso tem duas colunas, adapte para as suas tabelas
	Object[] obj = {tabelaOrigem.getValueAt(tabelaOrigem.getSelectedRow(), 0),tabelaOrigem.getValueAt(tabelaOrigem.getSelectedRow(), 1)};

	//Adiciona no destino e remove da origem
	modelDestino.addRow(obj);
	modelOrigem.removeRow(tabelaOrigem.getSelectedRow());
} else { 
//Não tem nenhuma linha selecionada na tabela de origem, faça um aviso para o usuário ou algo do tipo.
}

Obs: Não é recomendavel usar o DefaultTableModel, este é apenas um exemplo, veja esse post no próprio forum para saber mais sobre isso: http://www.guj.com.br/java/199067-redimensionar-jtable---pra-variar--resolvido-/2#1001295

Nicolas_Fernandes

Opa, samuelM!
Realmente, não use o DefaultTableModel. Além de ser um saco ter que ficar fazendo cast toda hora, você não trabalha diretamente com as classes de domínio do sistema, sem contar que é um porre pra fazer manutenção.

Você pode criar um modelo para a sua JTable. Uma classe que estenda de AbstractTableModel [para aprender direitinho, acesse minha assinatura]. Supondo que você foi na minha assinatura e entendeu como funciona, você pode criar um método get e um método set para a sua coleção da classe.
public class SeuProprioTableModel extends AbstractTableModel {

    private List<SuaClasse> suaColecao;
    public SeuProprioTableModel(List<SuaClasse> suaColecao) {
        this.suaColecao = suaColecao == null ? new ArrayList<SuaClasse>() : suaColecao;
    }

    // aqui você retorna todas as linhas da tabela.
    public List<SuaClasse> getSuaColecao() {
        return suaColecao;
    }

    // aqui você retorna uma linha específica.
    public SuaClasse getObjetoAt(int rowIndex) {
        return suaColecao.get(rowIndex);
    }

    // aqui você pode retornar várias linhas de uma única vez.
    // particularmente eu usaria o de cima, mas é  um exemplo.
    public List<SuaClasse> getColecaoAt(int... rows) {

        List<SuaClasse> colecaoTemp = new ArrayList<SuaClasse>();
        for (int row : rows) {
            colecaoTemp.add(suaColecao.get(row));
        }
        return colecaoTemp;
    }

    // aqui você seta os dados novos na tabela e avisa que estes foram trocados.
    public void setSuaColecao(List<SuaClasse> suaColecao) {

        this.suaColecao = suaColecao;
        fireTableDataChanged();
    }

    // aqui você adiciona uma única linha na tabela.
    public void addObjeto(SuaClasse objeto) {

        this.suaColecao.add(objeto);
        fireTableRowsInserted(suaColecao.size(), suaColecao.size());
    }

    // aqui você remove um objeto de uma linha da tabela.
    public void removeObjeto(int rowIndex) {

        this.suaColecao.remove(rowIndex);
        fireTableRowsDeleted(rowIndex, rowIndex);
    }
}
Agora, você pode criar um modelo para cada uma das tabelas e, no evento de um botão ou qualquer componente que passará as linhas de uma tabela para a outra, tratar isso.
public Formulario extends JFrame {

    private SeuProprioTableModel modeloTabelaUm, modeloTabelaDois;
    private JTable tabelaUm, tabelaDois;
    private JButton buttonTransferir;
 
    public Formulario() {

        List<SuaClasse> colecao = new List<SuaClasse>();
        // preencha a coleção com alguns dados para você ver como funciona.

        modeloTabelaUm = new SeuProprioTableModel(colecao);
        modeloTabelaDois = new SeuProprioTableModel(null); // ela começa vazia.


        tabelaUm = new JTable(modeloTabelaUm);
        tabelaDois = new JTable(modeloTabelaDois);
        buttonTransferir.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent event) {
 
                // para cada linha selecionada...
                for (int row : tabelaUm.getSelectedRows) {
               
                    SuaClasse objeto = modeloTabelaUm.getObjetoAt(row); // pego o objeto de uma linha...
                    modeloTabelaDois.addObjeto(objeto); // adiciono na tabelaDois...
                    modeloTabelaUm.removeObjeto(row); // e removo da tabelaUm!
                }
            }
        });
    }
}
Sacou a ideia? Espero ter ajudado. Fique com Deus, abraço!
S

deu este erro pco

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 87 > 0
        at java.util.Vector.insertElementAt(Vector.java:594)

fis da maneira que falo coloquei esse metodo no actionperformed do botao e troquei o nome da variavel da jtable

S
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1 >= 0
        at java.util.Vector.removeElementAt(Vector.java:554)
Nicolas_Fernandes

A ideia é mais ou menos essa. Tá faltando coisa, mas tira isso por base.

Criado 3 de outubro de 2011
Ultima resposta 4 de out. de 2011
Respostas 5
Participantes 3