Remover Row da JTable

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.

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.

1 curtida

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

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.

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.

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

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

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?

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.

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

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’ "

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)

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

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

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

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

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.

1 curtida