Remover Row da JTable

17 respostas
swingjava
J

Oi, bom dia!

Gostaria de remover as linhas onde o item da coluna 8 seja igual “Não”, eu já consegui pegar a String e consequentemente o índice,só não estou conseguindo excluir a linha, já tentei os comandos comentados mas não obtive resultado.

17 Respostas

S

Primeiro eu sugiro que troque essa implementação com DefaultTableModel para utilizar um TableModel próprio estendendo a classe AbstractTableModel.

Aí você simplesmente vai renderizar uma coleção (LinkedList, ArrayList…) de objetos.

Feito isso, ao remover um objeto da coleção (ou adicionar um objeto nela), basta invocar o método fireTableDataChanged() que a JTable vai se “repintar” apresentando somente os objetos presentes na coleção.

R

staroski, é melhor usar o fireTableDataChanged ou select * from tabela? Ou da no mesmo?

J

Estava pensando em antes de setar as linhas, fazer esse filtro no arraylist antes de setar a JTable, mas ainda assim estou com problemas, estava pedindo pra inicializar o array que vai receber o índice dos itens que não iguais a “Não” ai deixei estático com aquele número alto só pra testar, mas olhando esse código vocês conseguem identificar o erro? ou esta errado da forma que eu estou pensando ou fazendo?

ainda assim eu estou conseguindo pegar os itens que são iguais a “Não” e contar normalmente só na hora de jogar o indice no array que da o erro.

J

A consulta já ta gigante, por isso queria que esse filtro fosse feito depois que os dados já estivessem no sistema, até já tentei mas quando coloco a consulta fica errada.

R

Você quer selecionar as que estão com “não” ou excluir?

No erro ta falando que vc colocou 12 índices, posições.
Mas vc só tem 11

S

Sua pergunta não faz sentido

fireTableDataChanged() é um método do AbstractTableModel

select * from tabela é uma query SQL

Uma coisa não tem nada a ver com a outra

R

Opa, desculpe, é que eu tô acostumado a só colocar a query.

Eu tenho um método chamado: preencherTabela:

public void preencherTabela(String SQL) {
        conecta.conexao();
        ArrayList dados = new ArrayList();
        String[] Colunas = new String[]{"ID","Apartamento"};
        conecta.executaSQL(SQL);
        try {
            conecta.rs.first();
            do {
                dados.add(new Object[]{conecta.rs.getString("id"),conecta.rs.getString("apto")});
            } while (conecta.rs.next());
        } catch (SQLException ex) {
            //JOptionPane.showMessageDialog(rootPane, "Lista de Cadastro Vazia!");
        }

        ModeloTabela modelo = new ModeloTabela(dados, Colunas);
        tabela.setModel((TableModel) modelo);
        tabela.getColumnModel().getColumn(0).setMaxWidth(0);
        tabela.getColumnModel().getColumn(0).setMinWidth(0);
        tabela.getTableHeader().getColumnModel().getColumn(0).setMaxWidth(0);
        tabela.getTableHeader().getColumnModel().getColumn(0).setMinWidth(0);
        tabela.getColumnModel().getColumn(1).setPreferredWidth(550);
        tabela.getColumnModel().getColumn(0).setResizable(false);
        tabela.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        tabela.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        conecta.desconecta();
    }

Qual a diferença depois de eu salvar eu chamar esse método e usar o fire?

J

O objetivo é identificar os indices do arraylis [i],[8] que possuem "Não e excluir a linha do arraylist e depois disso eu ja tenho e já funciona a parte que joga o arraylist na jtable.

J

O método que estou usando segue esse mesmo padrão.

R

Jhonatan, nao é mais fácil vc excluir antes de iniciar? Ou a pessoa que vai estar utilizando a máquina que vai precisar excluir?

Tem como fazer assim: cria um botão, e coloca lá "DELETE FROM suaTabela WHERE suaColuna ‘Não’ "

J

Depois da consulta ele guarda os dados no arraylist dados mas andes desse trecho do código que é responsável por inserir na tabela eu queria deletar a linha antes, o estranho é que só ta deletando algumas e ta dando erro quando tô percorrendo o array, só ta excluindo algumas, (o usuário não fará nenhuma ação)

J

J

Vocês poderiam me ajudar aqui nessa parte por favor?

int[] array =new int[10000];

int j = 0;

int tamanho = dados.size();
for (int i = 0; i < tamanho; i++) {
        System.out.println("Valor de i = "+i);
        String var = "" + (((Object[]) dados.get(i))[PegarRadioButton()]);
        System.out.println(var);
        
        if (var.equals("Não")) {

          System.out.println("Valor de j = "+j);
            array[j] = i;

            j++;

        }
    }

    for (int i = 0; i < array.length; i++) {
        System.out.println(array[i]);
        dados.remove(array[i]);
    }

    ModeloTabela modelo = new ModeloTabela(dados, Colunas);

    projetos.setModel(modelo);

Valor de i = 0
Sim
Valor de i = 1
Sim
Valor de i = 2
Sim
Valor de i = 3
Não
Valor de j = 0
Valor de i = 4
Não
Valor de j = 1
Valor de i = 5
Sim
Valor de i = 6
Não
Valor de j = 2
Valor de i = 7
Não
Valor de j = 3
Valor de i = 8
Não
Valor de j = 4
Valor de i = 9
Não
Valor de j = 5
Valor de i = 10
Não
Valor de j = 6
Valor de i = 11
Não
Valor de j = 7
Valor de i = 12
Não
Valor de j = 8
Valor de i = 13
Não
Valor de j = 9
Valor de i = 14
Sim
Valor de i = 15
Não
Valor de j = 10
Valor de i = 16
Não
Valor de j = 11
Valor de i = 17
Não
Valor de j = 12
Valor de i = 18
Não
Valor de j = 13
3
4
6
7
8
9
10
11
12
Exception in thread “AWT-EventQueue-0” java.lang.IndexOutOfBoundsException: Index: 12, Size: 11

S

Caraca, quanto código…

Esse código só deveria ser executado uma vez após instanciar a JTable:

ModeloTabela modelo = new ModeloTabela(dados, Colunas);
    tabela.setModel((TableModel) modelo);
    tabela.getColumnModel().getColumn(0).setMaxWidth(0);
    tabela.getColumnModel().getColumn(0).setMinWidth(0);
    tabela.getTableHeader().getColumnModel().getColumn(0).setMaxWidth(0);
    tabela.getTableHeader().getColumnModel().getColumn(0).setMinWidth(0);
    tabela.getColumnModel().getColumn(1).setPreferredWidth(550);
    tabela.getColumnModel().getColumn(0).setResizable(false);
    tabela.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    tabela.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

Pôxa, precisa mesmo utilizar um array de Object?
Não tem uma classe Apartamento?

try {
        conecta.rs.first();
        do {
            dados.add(new Object[]{conecta.rs.getString("id"),conecta.rs.getString("apto")});
        } while (conecta.rs.next());
    } catch (SQLException ex) {
        //JOptionPane.showMessageDialog(rootPane, "Lista de Cadastro Vazia!");
    }

Esse código eu tiraria da tela e deixaria no modelo da aplicação com um método que retornasse uma lista de Apartamento:

Aí o método preencherTabela ficaria assim:

public void preencherTabela() {
    List<Apartamento> apartamentos = modeloAplicacao.getApartamentos();
    modeloTabela.setDados(apartamentos);
}
R

o que é esse: 3 4 5 6 7 8 9 10 11 12? Ele só pode chegar até o 11

R

Opa, valeu Staroski. Isso dá um ganho de performance ou faz parte das boas práticas?

S

Na verdade as duas coisas.
O problema ali é só lógica.
O swing é todo MVC, a grande maioria dos componentes possui uma interface para seus modelos de dados, mas raramente vejo alguém utilizando.
Não deve sair fazendo as coisas na tentativa e erro.

Criado 27 de junho de 2018
Ultima resposta 29 de jun. de 2018
Respostas 17
Participantes 3