JTable Removendo colunas em tempo de execução

41 respostas
M

Bem gente, é isso mesmo, to tentando implementar na minha JTable a possibilidade de o usuário poder adicionar e remover colunas em tempo de execução. Adicionar já consegui implementar, porém to tendo problemas para remover, tipo, eu até consigo remove-la porém quando adiciono a mesma coluna novamente ela aparece duplicada, ou sejá, ela adiciona duas vezes a coluna, como se ao remover a coluna ela não fosse realmente removida mas apenas escondida, ai ele adiciona uma nova coluna e reexibe a que foi excluida.

abaixo segue os códigos

metodo adiciona coluna

public static void adicionarColunas(JTable tabela, DefaultTableModel modelo, Object titulo,
            String colunBD, String colChave, ResultSet resultConsu, ResultSet resultCont){

        TableColumn coluna = new TableColumn(modelo.getColumnCount());
        coluna.setHeaderValue(titulo);

        try {
            resultCont.first();
            resultConsu.first();
            int ind = resultCont.getInt(colChave);
            String linha[] = new String[ind];
            for(int i = 0; i < ind; i++){
                linha[i] = resultConsu.getString(colunBD);
                resultConsu.next();
            }
            resultConsu.first();
            tabela.addColumn(coluna);
            modelo.addColumn(titulo.toString(), linha);
        }
        catch(SQLException erro){
            JOptionPane.showMessageDialog(null,"Erro ao listar no JTable " + erro);
        }
    }

e aqui o método onde eu estou tendo problemas, metodo remove colunas

public static void removeColuna(JTable Tabela, String titulo){
        int indice = Tabela.getColumnModel().getColumnIndex(titulo);
        Tabela.removeColumn(Tabela.getColumnModel().getColumn(indice));
    }
}

Bem agora antes que alguém pergunte. NÃO!, eu não estou usando AbtractTableModel, estou usando default.
Agora alguns motivos para eu não usa AbtractTableModel (1- A aplicação já está toda escrita em cima de DefualtTableModel sendo assim fica inviável mudar toda a estrutura das várias JTables existentes na aplicação, 2- Esse é meu primeiro trabalho sério em java não tenho grande dominio sobre JTable, 3- Implementar AbtractTableModel é complexo até hoje nunca achei nada de fácil entendimento sobre AbstractTableModel, 4- Implementar AbstractTableModel exigiria que eu dedicasse um tempo (sabesse-la quanto) para estudar o assunto e no momento eu estou correndo contra o tempo para concluir essa migração de um sistema CLIPPER para JAVA.

Em outro forum eu encontrei um tópico de alguém que estava tendo o mesmo problema, a galera até tentou ajudar até que apareceu um falando de AbtractTableModel e pronto, o tópico morreu.

Então peço aos senhores que por gentileza não me falem de AbstractTableModel :lol:

Eu conheço esse recursso, sei que ele trás muitas vantagens mas no momento ele não está adequado nesse caso.

Agradeço a todos que tentarem ajudar.

41 Respostas

M

O que eu reparei é que tato JTable quanto o DefaultTableModel tem o metodo addColumn() porém o mesmo não acontece com o metodo removeColumn onde só o JTable tem. Então eu axo que pela lógica assim como para eu adicionar uma coluna eu adiciono na JTable e no modelo teria que ser assim também para remover, remover tanto na JTable quanto no modelo.

Alguém tem alguma dica?

M

Como voce não quer ouvir falar sobre AbstractTableModel a unica coisa que te digo.

Com o Default a unica solução que voce tem é criar um novo e setar na JTable.

good luck

V

Realmente, vai ter trabalho nesse sentido. Se talvez você tivesse alterado desde o primeiro tópico, teria menos trabalho agora.
Mas agora, terá que mudar tudo, não tem jeito.

Me desculpe. Mas se você usa profissionalmente um exemplo, seu trabalho não é sério. Se deveria ser sério, acho bom você parar um tempo e estudar o uso correto do componente.

Ele é menos complexo do que usar o DefaultTableModel. Mas sim, exige que você dedique um tempo e entenda o conceito envolvido em seu uso. Não estamos sugerindo o seu uso aqui porque queremos que você sofra, ou porque temos tendência sádicas. Estamos sugerindo pois é a forma correta de se fazer. Se você não quer aprender a forma correta, ou como o Java trabalha, sugiro que não migre seu sistema de Clipper para Java.

Mas aqui cheira o real motivo em seus argumentos. Você não quer aprender. Seja porque está encontrando dificuldades, ou porque teria que estudar os conceitos de OO também. E por isso, desistiu e está tentando tomar um caminho que para você “cheira” mais fácil. Mas tenha certeza do seguinte: não é. Você está tomando o caminho menos flexível, menos eficiente e mais difícil.

Acho melhor se perguntar quanto tempo você já perdeu fazendo a implementação de maneira incorreta. Quanto tempo ainda está disposto a sacrificar mantendo o uso desse modelo difícil, ou quanto tempo irá sacrificar para fazer gambiarras para que o DefaultTableModel se comporte de maneiras mais complexas do que a implementação feijão com arroz para qual ele foi criado.

Por isso, pare de jogar tempo fora e faça um esforço genuíno para entender como o JTable funciona.

M

Exceto a parte do trabalho não ser sério e o da hipotese de eu não querer aprender o restantes das críticas são construtivas.

O trabalho é extremamente sério e não se pode negar que trabalhar com DefaultTableModel é muito mais simples do que implementar abstract, desde que o objetivo da JTable sejá só o fejão com arroz como vc falow, para trabalhos mais complexos e para uma JTable mais dinâmica com certeza AbstractTableModel é bem mais indicado.

Não querer aprender é outra carapuça que não me serve, a linguagem java é extremamente diferente da linguagem clipper com que trabalhei durante anos, muitos amigos meus clippeiros preferiram migrar para linguagem mais amigavel e com sintax mais semelhante ao clipper como Visual FoxPro, XHarbour, FiveWin, VisualObjects e por ai vai. Eu fiz diferente tinha uma visão mais longe queria mais poder e flexibilidade, e quando conheci java não tive dúvidas que seria ela minha nova linguagem. Sou desenvolvedor autônomo nunca fiz um curso de java nem de OO, estou realizando a migração de um de vários sistemas que tenho escrito em clipper para java utilizando apenas os conhecimento adquiridos durante uns anos de estudo autodidata sobre java, o conceito OO eu conheço bem porém só o tempo e a prática fará com que eu consiga tirar 100% do seu proveito.
Realmente essa é uma migração que não tenho muito tempo de prazo para fazer por isso estou pensando em utilizar JTable apenas de forma básica e numa próxima atualização entregar o sistema com uma tabela mais dinâmica. Eu sempre procuro fazer uma implementação da maneira mais correta possivel é por isso que constantemente estou aqui pedindo a opinião da galera mais experiente.

Ainda estou aprocura de informações e exemplos mais claros e limpos de AbstractTableModel, um exemplo voltado para quem tem pouca experiência.
Os tutos que se encontra tem muito código no conteúdo mas pouca explicação do mesmo. Os códigos de exemplo são lançados e apenas uma explicação de modo geral é feita, entender o restante do código fica por conta de quem está lendo. Ai agente sempre se depara com algumas linhas que não foram possiveis entender. Estou a procura de um exemplo mais limpo para profissionais de todos os niveis.

Eu consegui fazer com que a coluna excluida pare de aparecer para isso é necessário apenas uma linha.

Apenas isso resolve o problema, acredito que pelo fato da galera pouco ou nunca usar DefaultTableModel não tem muita familiaridade. Mas ta ai pro caso de alguém ter o mesmo problema.

Porém realmente usar Default dá muita dor de cabeça pois a coluna parou de reaparecer mas agora está gerando uma excessão, vou dar uma analizada e posto o problema ou a solução aqui.

Se alguém poder me indicar mais exemplos do uso de Abstract agradeço, adimito que estou tendo muita dificudade em entender.

V

Só pra constar. Eu já fui clipeiro e admito que no começo dá muita dificuldade em entender os conceitos de OO e do Java. E, para ser bem sincero, o JTextField com formatação do Java não chega aos pés do existente no clipper.

O que você deve entender é que nos métodos do AbstractTableModel você estará dizendo ao JTable o que ela deve desenhar. Cada método, diz ao java uma coisa diferente.

Por exemplo. Considere que você vai escrever um TableModel para mostrar livros na tela, e quer exibir 2 colunas, uma para o autor (coluna 0) e outra para o título (coluna 1).

public class LivrosTableModel extends AbstractTableModel {
    private static final int COL_AUTOR = 0;
    private static final int COL_TITULO = 1;

    private List&lt;Livro&gt; valores;       

    //Esse é um construtor, que recebe a nossa lista de livros
    public TitulosTableModel(List&lt;Livro&gt; valores) {
          this.valores = new ArrayList&lt;Livro&gt;(valores);
    }

    public int getRowCount() {
        //Quantas linhas tem sua tabela? Uma para cada item da lista.
        return valores.size();
    }

    public int getColumnCount() {
        //Quantas colunas tem a tabela? Nesse exemplo, só 2.
        return 2;
    }

    public String getColumnName(int column) {
        //Qual é o nome das nossas colunas?
        if (column == COL_AUTOR) return "Autor";
        if (column == COL_TITULO) return "Título";
        return ""; //Nunca deve ocorrer
    }

    public Object getValueAt(int row, int column) {
        //Precisamos retornar o valor da coluna column e da linha row.
        Livro titulo = valores.get(row);
        if (column == COL_AUTOR) return titulo.getTitulo();
        else if (column == COL_TITULO) return titulo.getAutor().getNome();
        return ""; //Nunca deve ocorrer
    }

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        Livro titulo = valores.get(row);
        //Vamos alterar o valor da coluna columnIndex na linha rowIndex com o valor aValue passado no parâmetro.
        //Note que vc poderia alterar 2 campos ao invés de um só.
        if (columnIndex== COL_TITULO) titulo.setTitulo(aValue.toString());
        else if (columnIndex== COL_AUTOR) titulo.getAutor().setNome(aValue.toString());
    }

    public Class<?> getColumnClass(int columnIndex) {
        //Qual a classe das nossas colunas? Como estamos exibindo texto, é string.
        return String.class;
    }
    
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        //Indicamos se a célula da rowIndex e da columnIndex é editável. Nossa tabela toda é.
        return true;
    }
    //Já que esse tableModel é de livros, vamos fazer um get que retorne um livro inteiro.
    //Isso elimina a necessidade de chamar o getValueAt() nas telas. 
    public Livro get(int row) {
        return valores.get(row);
    }
}

Depois, para usar esse model vc só faz:
suaTable.setModel(new LivrosTableModel(listaDeLivros));

O que o Java faz na hora de desenhar a tabela? O objeto JTable:

  1. Chama os método getColumnsCount() e getRowsCount() para descobrir quantas linhas e colunas deve desenhar;
  2. Chama o método getColumnTitle() para saber que informações irá no título da tabela;
  3. Chama o método getValueAt para saber o que escrever dentro da célula
  4. Chama o método getColumnClass() para saber como desenhar a informação. Em células do tipo Boolean.class, aparecerá um checkbox, células do tipo Integer.class serão alinhadas a direita.
  5. E, também, chama o método isCellEditable para verificar se deve ou não habilitar o editor.

O que as vezes demora a cair a ficha é notar que seus métodos estão respondendo ao Java. Quem chamará um método como
public Object getValueAt(int row, int column) é o JTable, enquanto está se desenhando.
Ele que dirá “Ei, quero desenhar o objeto da linha 1, coluna 3, que valor você tem pra mim aí?”

Você vai notar, depois que aprender a usar o AbstractTableModel, que o trabalho que você tem hoje no Default é enorme. Parece ainda maior se você considerar a existência de modelos ainda mais automáticos, como o do Mark. O seu código atual também fica muito desorganizado. A escrita da tabela se mistura ao código da interface gráfica. Estendendo do abstract, tudo fica separadinho:
Desenho é com a JTable
Dados é com o model
Lógica da interface é na Tela.

Desculpe o tom provocativo do post anterior. A idéia era realmente te irritar. Nem que vc se motivasse novamente a aprender o model, só pra depois jogar na minha cara. :lol:

O esforço realmente vale a pena.

M

Só pra constar.

O link do TableModel que fiz está na minha assinatura e na do ViniGodoy.

ObjectTableModel

L

Oi,

olha o código que encontrei que não precisa a AbstractTable.:

public void removeColumnAndData(JTable table, int vColIndex) {
    MyDefaultTableModel model = (MyDefaultTableModel)table.getModel();
    TableColumn col = table.getColumnModel().getColumn(vColIndex);
    int columnModelIndex = col.getModelIndex();
    Vector data = model.getDataVector();
    Vector colIds = model.getColumnIdentifiers();
    
    table.removeColumn(col);
    
    colIds.removeElementAt(columnModelIndex);
    
    for (int r=0; r<data.size(); r++) {
      Vector row = (Vector)data.get(r);
      row.removeElementAt(columnModelIndex);
    }
    model.setDataVector(data, colIds);
    
    Enumeration enume = table.getColumnModel().getColumns();
    for (; enume.hasMoreElements(); ) {
      TableColumn c = (TableColumn)enume.nextElement();
      if (c.getModelIndex() >= columnModelIndex) {
        c.setModelIndex(c.getModelIndex()-1);
      }
    }
    model.fireTableStructureChanged();
  }

class MyDefaultTableModel extends DefaultTableModel {
  public Vector getColumnIdentifiers() {
    return columnIdentifiers;
  }
}

Tchauzin!

M

Ae ViniGodoy, show de bola cara, até que em fim consegui entender essa bagaça.
Realmente é muito simples, seu exemplo me ajudou até a entender o que é um modelo que sinceramente antes eu não sabia, apenas fazia de forma mecânica o que eu tinha visto nos livros, realmente fica bem mais elegante.
Se não for muito trabalho vc poderia deixar esse tópico fixo, para que outros que tenham dificudade de entendar AbstractTableModel consigam de uma vez entender com esse tópico.
Axo que todos os tutoriais deveriam ser assim usar exemplos simples e explicando todo o processo. E não exemplos complexos com pouca explicação do código.
Se vc concordar em deixar fixo pode mudar o titulo para que fique mais indicativo do conteúdo.
Fiquei tão empolgado que vou tentar convencer o cliente para ganhar mais um tempo e implementar logo abstract em todas as JTables do sistema, até porque no projeto minhas JTables serão extremamente dinâmicas (ex: incluir e excluir colunas em tempo real; clicar no titulo da coluna para definir por onde vai ser a ordenação e se vai ser crescente ou decrescente; emais alguns detalhes…)

Durante a fase de implementação qualquer dúvida eu posto aqui no forúm.

Valeu…

M

Agora o desafio vai ser criar um modelo que sirva para todas as JTable do sistema, para isso ele deverá se inteligente pois não saberá com antecedência qual a quantidade de colunas nem o nome das mesmas.

Bem ja fiz coisas parecidas com isso em outras classes do sistema, vamo ver o que eu consigo fazer.

O resultado eu posto aqui. Se alguém poder dar uma dica será bem vinda.

falow

M

Minha dica é essa.

ObjectTableModel

Ela é bem genérica e voce só precisa desse Model para todas JTables.

V

Aproveita e dá uma olhada também no TableModel de auto-filtro, que está na minha assinatura.

Ele permite o auto-filtro igual ao do excel. Assim, seu cliente poderá tanto ordenar, quando filtrar dados repetidos. O modelo é configurável e permite que você escolha que colunas conterão ordenação, ordenação e filtragem e quais não conterão nada.

Ele pode ser usado em conjunto com qualquer TableModel, inclusive o do Mark, ou os seus próprios.

N

ViniGodoy:
Só pra constar. Eu já fui clipeiro e admito que no começo dá muita dificuldade em entender os conceitos de OO e do Java. E, para ser bem sincero, o JTextField com formatação do Java não chega aos pés do existente no clipper.

O que você deve entender é que nos métodos do AbstractTableModel você estará dizendo ao JTable o que ela deve desenhar. Cada método, diz ao java uma coisa diferente.

Por exemplo. Considere que você vai escrever um TableModel para mostrar livros na tela, e quer exibir 2 colunas, uma para o autor (coluna 0) e outra para o título (coluna 1).

public class LivrosTableModel extends AbstractTableModel {
    private static final int COL_AUTOR = 0;
    private static final int COL_TITULO = 1;

    private List&lt;Livro&gt; valores;       

    //Esse é um construtor, que recebe a nossa lista de livros
    public TitulosTableModel(List&lt;Livro&gt; valores) {
          this.valores = new ArrayList&lt;Livro&gt;(valores);
    }

    public int getRowCount() {
        //Quantas linhas tem sua tabela? Uma para cada item da lista.
        return valores.size();
    }

    public int getColumnCount() {
        //Quantas colunas tem a tabela? Nesse exemplo, só 2.
        return 2;
    }

    public String getColumnName(int columnIndex) {
        //Qual é o nome das nossas colunas?
        if (column == COL_AUTOR) return "Autor";
        if (column == COL_TITULO) return "Título";
    }

    public Object getValueAt(int row, int column) {
        //Precisamos retornar o valor da coluna column e da linha row.
        Livro titulo = valores.get(row);
        if (column == COL_AUTOR) return titulo.getTitulo();
        else if (column == COL_TITULO) return titulo.getAutor().getNome();
    }

    public  void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        //Vamos alterar o valor da coluna columnIndex na linha rowIndex com o valor aValue passado no parâmetro.
        //Note que vc poderia alterar 2 campos ao invés de um só.
        if (column == COL_TITULO) titulo.setTitulo(aValue.toString());
        else if (column == COL_AUTOR) titulo.getAutor().setNome(aValue.toString());
    }

    public  Class getColumnClass(int columnIndex) {
        //Qual a classe das nossas colunas? Como estamos exibindo texto, é string.
        return String.class;
    }
    
    boolean isCellEditable(int rowIndex, int columnIndex) {
        //Indicamos se a célula da rowIndex e da columnIndex é editável. Nossa tabela toda é.
        return true;
    }
    //Já que esse tableModel é de livros, vamos fazer um get que retorne um livro inteiro.
    //Isso elimina a necessidade de chamar o getValueAt() nas telas. 
    public Livro get(int row) {
        return valores.get(row);
    }
}

Depois, para usar esse model vc só faz:
suaTable.setModel(new LivrosTableModel(listaDeLivros));

O que o Java faz na hora de desenhar a tabela? O objeto JTable:

  1. Chama os método getColumnsCount() e getRowsCount() para descobrir quantas linhas e colunas deve desenhar;
  2. Chama o método getColumnTitle() para saber que informações irá no título da tabela;
  3. Chama o método getValueAt para saber o que escrever dentro da célula
  4. Chama o método getColumnClass() para saber como desenhar a informação. Em células do tipo Boolean.class, aparecerá um checkbox, células do tipo Integer.class serão alinhadas a direita.
  5. E, também, chama o método isCellEditable para verificar se deve ou não habilitar o editor.

O que as vezes demora a cair a ficha é notar que seus métodos estão respondendo ao Java. Quem chamará um método como
public Object getValueAt(int row, int column) é o JTable, enquanto está se desenhando.
Ele que dirá “Ei, quero desenhar o objeto da linha 1, coluna 3, que valor você tem pra mim aí?”

Você vai notar, depois que aprender a usar o AbstractTableModel, que o trabalho que você tem hoje no Default é enorme. Parece ainda maior se você considerar a existência de modelos ainda mais automáticos, como o do Mark. O seu código atual também fica muito desorganizado. A escrita da tabela se mistura ao código da interface gráfica. Estendendo do abstract, tudo fica separadinho:
Desenho é com a JTable
Dados é com o model
Lógica da interface é na Tela.

Desculpe o tom provocativo do post anterior. A idéia era realmente te irritar. Nem que vc se motivasse novamente a aprender o model, só pra depois jogar na minha cara. :lol:

O esforço realmente vale a pena.

ViniGodoy utilizando seu exemplo ocorreu alguns erros que não consegui identificar, o que seria o “column” no código ?

valew

V

É o índice da coluna. Recebido como parâmetro. Em um método estava errado mesmo, pq chamei o parâmetro de columnIndex. Já corrigi lá em cima.

N

Entendi o parâmetro. Só mais uma coisa Vini, em dois métodos o “getValueAt” e o “setValueAt” está dando erro no cabeçalho do método “missing return statement”, o que poderia ser?

obrigado.

obs: sou novo em java.

M

Entendi o parâmetro. Só mais uma coisa Vini, em dois métodos o “getValueAt” e o “setValueAt” está dando erro no cabeçalho do método “missing return statement”, o que poderia ser?

obrigado.

obs: sou novo em java.
O getValueAt é um método que deve retornar um Object. No caso é feita uma verificação: se a coluna é um, retorna uma coisa; se é dois, retorna outra. Mas se não for um nem dois? Por isso o compilador reclama. Teoricamente isso não deve acontecer e a maneira mais simples de corrigir isso é lançar uma exceção:

public Object getValueAt(int row, int column) {  
        //Precisamos retornar o valor da coluna column e da linha row.  
        Livro titulo = valores.get(row);  
        if (column == COL_AUTOR) return titulo.getTitulo();  
        else if (column == COL_TITULO) return titulo.getAutor().getNome();
        throw new IllegalArgumentException("Invalid column");
}

O método setValueAt não deveria apresentar esse erro uma vez que ele tem retorno void (vazio).

N

Entendi o parâmetro. Só mais uma coisa Vini, em dois métodos o “getValueAt” e o “setValueAt” está dando erro no cabeçalho do método “missing return statement”, o que poderia ser?

obrigado.

obs: sou novo em java.
O getValueAt é um método que deve retornar um Object. No caso é feita uma verificação: se a coluna é um, retorna uma coisa; se é dois, retorna outra. Mas se não for um nem dois? Por isso o compilador reclama. Teoricamente isso não deve acontecer e a maneira mais simples de corrigir isso é lançar uma exceção:

public Object getValueAt(int row, int column) {  
        //Precisamos retornar o valor da coluna column e da linha row.  
        Livro titulo = valores.get(row);  
        if (column == COL_AUTOR) return titulo.getTitulo();  
        else if (column == COL_TITULO) return titulo.getAutor().getNome();
        throw new IllegalArgumentException("Invalid column");
}

O método setValueAt não deveria apresentar esse erro uma vez que ele tem retorno void (vazio).

Deu certo Marco, na hora que inclui a exceçao no “getValueAt” parou também o erro no “setValueAt”.

Mais uma dúvida eu chamo o método dessa maneira, conforme o exemplo do Vini:

suaTable.setModel(new LivrosTableModel(listaDeLivros));

no caso o “listaDeLivros” é a lista com os dados vindo do banco de dados?

valew

M

neto.fiamenghi:

Mais uma dúvida eu chamo o método dessa maneira, conforme o exemplo do Vini:

suaTable.setModel(new LivrosTableModel(listaDeLivros));

no caso o “listaDeLivros” é a lista com os dados vindo do banco de dados?

valew


Exatamente. Essa lista deve vir da sua classe DAO após fazer a consulta no banco.

N

marcobiscaro2112:
neto.fiamenghi:

Mais uma dúvida eu chamo o método dessa maneira, conforme o exemplo do Vini:

suaTable.setModel(new LivrosTableModel(listaDeLivros));

no caso o “listaDeLivros” é a lista com os dados vindo do banco de dados?

valew


Exatamente. Essa lista deve vir da sua classe DAO após fazer a consulta no banco.

Valew Marco. :smiley: ficou show.

P

Estou estudando o artigo acima e gostaria de saber, nessa linha:

private List<Livro> valores;

esse é uma classe?? de onde surgiu??

V

Sim, Livro é uma classe hipotética. Imagine que ela exista e foi implementada em algum lugar.

Ela é a classe que está sendo listada na tabela.

T

Pessoal, estou começando com jTables e minha aplicação ta cheia desses códigos espalhados:

public void consulta(Table){
        Object[] dados = new Object[N];
        DefaultTableModel model = (DefaultTableModel)tableMedico.getModel();
        model.setNumRows(0);

        String sql = "CONSULTA SQL";

        try {
            ConexaoBD con = new ConexaoBD();
            PreparedStatement ps = con.conn.prepareStatement(sql);
            ResultSet resultado = ps.executeQuery();

            while(resultado.next()){

                dados[0] = resultado.getString(1);
                dados[1] = resultado.getString(2);
                dados[2] = resultado.getString(3);
                dados[3] = resultado.getString(4);
                dados[4] = resultado.getString(5);
                dados[5] = resultado.getString(6);
                dados[6] = resultado.getString(7);
                dados[6] = resultado.getString(....);

                int[] tamCol = new int[7];
                tamCol[0]  = 5;
                tamCol[1]  = 70;
                tamCol[2]  = 35;
                tamCol[3]  = 25;
                tamCol[4]  = 10;
                tamCol[5]  = 60;
                tamCol[6]  = 60;
                tamCol[6]  = ...................;

                for(int i=0; i &lt; tableMedico.getColumnCount(); i++) {
                    TableColumn column = tableMedico.getColumnModel().getColumn(i);
                    column.setMinWidth(tamCol[i]);
                    column.setPreferredWidth(tamCol[i]);
                }

                // alinhamento
                DefaultTableCellRenderer esquerda = new DefaultTableCellRenderer();
                DefaultTableCellRenderer centralizado = new DefaultTableCellRenderer();
                DefaultTableCellRenderer direita = new DefaultTableCellRenderer();

                esquerda.setHorizontalAlignment(SwingConstants.LEFT);
                centralizado.setHorizontalAlignment(SwingConstants.CENTER);
                direita.setHorizontalAlignment(SwingConstants.RIGHT);

                tableMedico.getColumnModel().getColumn(0).setCellRenderer(esquerda);
                tableMedico.getColumnModel().getColumn(1).setCellRenderer(esquerda);

                model.addRow(dados);
            }
        } catch (SQLException ex) {
            Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

O que realmente eu acho PORCO!
Porém é a forma que eu estou achando mais simples…
Estou tentando entender o exemplo do Vinni, mas tá um pouco complicado, alguém teria um exemplo prático para me mandar e eu ver?Acho que ficaria mais fácil para entender!

Obrigado à todos.

M

Bom dia a todos!

ViniGodoi achei seu post procurando na net sobre JTable, e está me ajudando muito, parabéns pelo exemplo. Entretanto, estou com uma dúvida de como atualizar o Jtable pois tenho a seguinte situação:

Tenho um Jtable com os dados na tela principal, essa tela só mostra os dados, para adicionar ou editar dados eu clico num botão nessa tela e outra tela abre com os campos para edição ou criação de um novo registro. Bem, quando salvo o registro, preciso que o JTable da tela de trás seja atualizado.

Andei pesquisando sobre o padrão Observer, mas não estou conseguindo fazer o que preciso. Será que é possível vc postar um breve exemplo de como resolver esse problema da forma mais correta para o meu caso?

Abraço!

V

No seu caso não é necessário usar um Observer. Simplesmente abra um JDialog, e faça a comunicação entre as duas janelas através de passagem de parâmetros, como nesse exemploa aqui:
http://www.guj.com.br/posts/list/55710.java#292687

M

Desculpe não responder antes, estava com outras atividades…

Perfeito!!!

Acabei de fazer a modificação de acordo com o exemplo que vc passou e funcionou perfeitamente.

ViniGodoy obrigado pela ajuda! :smiley:

M

ViniGodoy, bom dia!

Agora estou com um problema que me deixou surpreso. Estou montando um jtable e nesse caso tenho que aplicar uma barra de rolagem horizontal, pois o tamanho dele não comporta
todas as colunas que preciso mostrar. O problema é que quando eu rolo a barra horizontal, o header fica desformatado nas colunas do final, como se não renderizasse corretamente, segue os fragmentos para melhor compreensão.

M

Esqueci de postar o fragmento de código da mensagem acima:

try {
       DefaultTableCellRenderer rendererCentro = new DefaultTableCellRenderer();   
       rendererCentro.setHorizontalAlignment(SwingConstants.CENTER);   

       DefaultTableCellRenderer rendererDireita = new DefaultTableCellRenderer();   
       rendererDireita.setHorizontalAlignment(SwingConstants.RIGHT);   

       DefaultTableCellRenderer rendererEsquerda = new DefaultTableCellRenderer();   
       rendererEsquerda.setHorizontalAlignment(SwingConstants.LEFT);   

       [b]JTableHeader header = jTable.getTableHeader();   
       header.setPreferredSize(new Dimension(0, 35));
       
       jTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
       jTable.setAutoscrolls(true);[/b]
       
       TableColumnModel modeloDaColuna = jTable.getColumnModel();
R

ViniGodoy:
Só pra constar. Eu já fui clipeiro e admito que no começo dá muita dificuldade em entender os conceitos de OO e do Java. E, para ser bem sincero, o JTextField com formatação do Java não chega aos pés do existente no clipper.

O que você deve entender é que nos métodos do AbstractTableModel você estará dizendo ao JTable o que ela deve desenhar. Cada método, diz ao java uma coisa diferente.

Por exemplo. Considere que você vai escrever um TableModel para mostrar livros na tela, e quer exibir 2 colunas, uma para o autor (coluna 0) e outra para o título (coluna 1).

public class LivrosTableModel extends AbstractTableModel {
    private static final int COL_AUTOR = 0;
    private static final int COL_TITULO = 1;

    private List&lt;Livro&gt; valores;       

    //Esse é um construtor, que recebe a nossa lista de livros
    public TitulosTableModel(List&lt;Livro&gt; valores) {
          this.valores = new ArrayList&lt;Livro&gt;(valores);
    }

    public int getRowCount() {
        //Quantas linhas tem sua tabela? Uma para cada item da lista.
        return valores.size();
    }

    public int getColumnCount() {
        //Quantas colunas tem a tabela? Nesse exemplo, só 2.
        return 2;
    }

    public String getColumnName(int column) {
        //Qual é o nome das nossas colunas?
        if (column == COL_AUTOR) return "Autor";
        if (column == COL_TITULO) return "Título";
        return ""; //Nunca deve ocorrer
    }

    public Object getValueAt(int row, int column) {
        //Precisamos retornar o valor da coluna column e da linha row.
        Livro titulo = valores.get(row);
        if (column == COL_AUTOR) return titulo.getTitulo();
        else if (column == COL_TITULO) return titulo.getAutor().getNome();
        return ""; //Nunca deve ocorrer
    }

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        //Vamos alterar o valor da coluna columnIndex na linha rowIndex com o valor aValue passado no parâmetro.
        //Note que vc poderia alterar 2 campos ao invés de um só.
        if (columnIndex== COL_TITULO) titulo.setTitulo(aValue.toString());
        else if (columnIndex== COL_AUTOR) titulo.getAutor().setNome(aValue.toString());
    }

    public Class&lt;?&gt; getColumnClass(int columnIndex) {
        //Qual a classe das nossas colunas? Como estamos exibindo texto, é string.
        return String.class;
    }
    
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        //Indicamos se a célula da rowIndex e da columnIndex é editável. Nossa tabela toda é.
        return true;
    }
    //Já que esse tableModel é de livros, vamos fazer um get que retorne um livro inteiro.
    //Isso elimina a necessidade de chamar o getValueAt() nas telas. 
    public Livro get(int row) {
        return valores.get(row);
    }
}

Depois, para usar esse model vc só faz:
suaTable.setModel(new LivrosTableModel(listaDeLivros));

O que o Java faz na hora de desenhar a tabela? O objeto JTable:

  1. Chama os método getColumnsCount() e getRowsCount() para descobrir quantas linhas e colunas deve desenhar;
  2. Chama o método getColumnTitle() para saber que informações irá no título da tabela;
  3. Chama o método getValueAt para saber o que escrever dentro da célula
  4. Chama o método getColumnClass() para saber como desenhar a informação. Em células do tipo Boolean.class, aparecerá um checkbox, células do tipo Integer.class serão alinhadas a direita.
  5. E, também, chama o método isCellEditable para verificar se deve ou não habilitar o editor.

O que as vezes demora a cair a ficha é notar que seus métodos estão respondendo ao Java. Quem chamará um método como
public Object getValueAt(int row, int column) é o JTable, enquanto está se desenhando.
Ele que dirá "Ei, quero desenhar o objeto da linha 1, coluna 3, que valor você tem pra mim aí?"

Você vai notar, depois que aprender a usar o AbstractTableModel, que o trabalho que você tem hoje no Default é enorme. Parece ainda maior se você considerar a existência de modelos ainda mais automáticos, como o do Mark. O seu código atual também fica muito desorganizado. A escrita da tabela se mistura ao código da interface gráfica. Estendendo do abstract, tudo fica separadinho:
Desenho é com a JTable
Dados é com o model
Lógica da interface é na Tela.

Desculpe o tom provocativo do post anterior. A idéia era realmente te irritar. Nem que vc se motivasse novamente a aprender o model, só pra depois jogar na minha cara. :lol:

O esforço realmente vale a pena.

Fiz esse exemplo do Vini, mas não consigo fazer mostrar o nome das Colunas quando mostra a tabela.
Alguém saberia dizer o que pode estar acontecendo, pq pelo que entendi o método getColumnName() é que adiciona o nome as colunas. E ele é chamado e os valores são retornados(vi pelo debug), mas quando aparece a tabela, aparece sem nome algum.

V

Você colocou sua tabela dentro de um JScrollPane? É necessário coloca-la para que o nome das colunas apareça.

R

Que rápido Vini :wink:

Hehe, não, coloquei em um JPanel.

Era isso mesmo, com JScrollPane funcionou.

Valeu Vini, muito boa essa dica. Realmente DefaultTableModel é bem mais chato de trabalhar.

V

O mais engraçado é que foi rápido e coincidência. Eu cheguei em casa, olhei os e-mails e a primeira mensagem era a desse tópico.

E
Bom, sei que é uma duvida meio tosca, mas é que eu to passando meio mal pra pegar a implementação de um modelo próprio pra tabela.
Até que peguei com DefaultTableModel mais realmente o código fica meio confuso. 
Se alguém puder  explicar melhor como ficaria um exemplo dessa clase <Livro>  
É que eu to tendo alguns erros quando tento fazer a minha tabela aqui.  :?
Agradeço desde  !

Bom, sei que é uma duvida meio tosca, mas é que eu to passando meio mal pra pegar a implementação de um modelo próprio pra tabela.
Até que peguei com DefaultTableModel mais realmente o código fica meio confuso.
Se alguém puder só explicar melhor como ficaria um exemplo dessa clase
É que eu to tendo alguns erros quando tento fazer a minha tabela aqui. :?
Agradeço desde já !

V
public final class Livro {
  private String titulo;
  private Autor autor;

  public Livro(String titulo, Autor autor) {
      setTitulo(titulo);
      setAutor(autor);
  }

  public void setTitulo(String titulo) {
    if (titulo == null) 
       throw new IllegalArgumentException("O título não pode ser nulo!");

    this.titulo = titulo.trim();
  }

  public String getTitulo() { 
     return titulo; 
  }

  public void setAutor(Autor autor) {
     if (autor == null)
        throw new IllegalArgumentException("O autor não pode ser nulo!");
     this.autor = autor;   
  }

  public Autor getAutor() {
     return autor;
  }
}
E a classe Autor:
public final class Autor {
    private String nome;
    private String descricao;

    public Autor(String nome, String descricao) {
       setNome(nome);
       setDescricao(descricao);
    }

    public void setNome(String nome) {
        if (nome == null)
            throw new IllegalArgumentException("O nome não pode ser nulo!");
        this.nome = nome.trim();
    }   

    public void getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        if (descricao == null)
            throw new IllegalArgumentException("A descricao não pode ser nula!");
        this.descricao = descricao.trim();
    }   

    public void getNome() {
        return nome;
    }
}
E

Pooooow brigadão cara ! _
Era isso msm que queria !

V

Tudo pela morte do DefaultTableModel.

J

Oi VinnyGodoy.

Eu sou novo em Java e estou tentando usar o AbstractTableModel.

Atualmente eu consigo obter o objeto se eu clicar duas vezes, porém, se eu reorganizo a tabela clicando em uma coluna, e clico duas vezes novamente ele me retorna o primeiro item de quando eu não tinha reorganizado.

Esta aqui é minha AbstractTableModel:

public class AlunoTableModel extends AbstractTableModel {
	
    private static final long serialVersionUID = 1L;
	
    private static final int COL_nome_aluno = 0;
    private static final int COL_endereco_aluno = 1;
    private static final int COL_tel_aluno = 2;
    private static final int COL_cel_aluno = 3;
    private static final int COL_atestado_aluno = 4;
    private static final int COL_dtNasc_aluno = 5;
    private static final int COL_dtDePgto_aluno = 6;
    private static final int COL_planoPagamento = 7;

    private List&lt;Aluno&gt; alunos;
  
    public AlunoTableModel(List&lt;Aluno&gt; _alunos) {
          this.alunos = new ArrayList&lt;Aluno&gt;(_alunos);
    }

    public int getRowCount() {  
        return alunos.size();  
    }  
  
    public int getColumnCount() {  
        return 8;
    }  
  
    public String getColumnName(int column) {  
        if (column == COL_nome_aluno) return "Nome";
        if (column == COL_endereco_aluno) return "Endereço";
        if (column == COL_tel_aluno) return "Telefone";
        if (column == COL_cel_aluno) return "Celular";
        if (column == COL_atestado_aluno) return "Atestado";
        if (column == COL_dtNasc_aluno) return "Data de Nascimento";
        if (column == COL_dtDePgto_aluno) return "Dia de Pagamento";
        if (column == COL_planoPagamento) return "Plano de Pagamento";
        return "";
    }  
  
    public Object getValueAt(int row, int column) {  
        Aluno aluno = alunos.get(row);
        if (column == COL_nome_aluno) return aluno.getNome_aluno();
        else if (column == COL_endereco_aluno) return aluno.getEndereco_aluno();
        else if (column == COL_tel_aluno) return aluno.getTel_aluno();
        else if (column == COL_cel_aluno) return aluno.getCel_aluno();
        else if (column == COL_atestado_aluno) return aluno.isAtestado_aluno();
        else if (column == COL_dtNasc_aluno) {
			SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");    
			Date d1 = null;
			
			try {    
			    d1 = f.parse(aluno.getDtNasc_aluno().toString());                
			} catch (Exception e) {    
			    e.printStackTrace();    
			}    
			    
			SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");    
			    
			return format.format(d1);
        }
        else if (column == COL_dtDePgto_aluno) return aluno.getDtDePgto_aluno();
        else if (column == COL_planoPagamento) return aluno.getPlanoPagamento();
        throw new IllegalArgumentException("Coluna Inválida");
    }  
  
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {  
    	Aluno aluno = new Aluno();
		DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
    	
        if (columnIndex == COL_nome_aluno)
        	aluno.setNome_aluno(aValue.toString());  
        else if (columnIndex == COL_endereco_aluno)
        	aluno.setEndereco_aluno(aValue.toString());
        else if (columnIndex == COL_tel_aluno) 
        	aluno.setTel_aluno(aValue.toString());
        else if (columnIndex == COL_cel_aluno) 
        	aluno.setCel_aluno(aValue.toString());
        else if (columnIndex == COL_dtNasc_aluno)
			try {
				aluno.setDtNasc_aluno(format.parse(aValue.toString()));
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		else if (columnIndex == COL_dtDePgto_aluno) 
        	aluno.setDtDePgto_aluno(Integer.parseInt(aValue.toString()));
        else if (columnIndex == COL_planoPagamento) 
        	aluno.setPlanoPagamento(aValue.toString());
    }
  
    public Class&lt;?&gt; getColumnClass(int columnIndex) {  
    	if (columnIndex == 4)
    		return Boolean.class;
    	if (columnIndex == 6)
    		return Integer.class;
        return String.class;  
    }  
      
    public boolean isCellEditable(int rowIndex, int columnIndex) {  
        return false;
    }  
    
    public Aluno get(int row) {  
        return alunos.get(row);  
    }
}

Pra obter o objeto eu usei o método abaixo:

public Aluno getAlunoDaLinhaSelecionada(List&lt;Aluno&gt; alunosList) {
    	if (table.getSelectedRow() == -1)
    		return null;
    	
    	return alunosList.get(table.getSelectedRow());
    }

e aqui está o evento do duplo clique:

table.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				if (arg0.getClickCount() == 2) {
					Aluno aluno = VPesquisarAluno.this.getAlunoDaLinhaSelecionada(TodosAlunos);
					
					if (pesquisar == true) {
						VAluno vAluno = new VAluno(false, true, true, true, aluno);
						vAluno.setVisible(true);
						vAluno.setLocationRelativeTo(null);
					} else if (alterar == true) {
						VAluno vAluno = new VAluno(false, true, false, false, aluno);
						vAluno.setVisible(true);
						vAluno.setLocationRelativeTo(null);
					} else if (excluir == true) {
						VAluno vAluno = new VAluno(false, false, true, false, aluno);
						vAluno.setVisible(true);
						vAluno.setLocationRelativeTo(null);
					} else if (pgto == true) {
						VPgto vPgto = new VPgto();
						vPgto.setVisible(true);
						vPgto.setLocationRelativeTo(null);
					}
		        }
			}
		});

se puder ajudar, ou ao menos responder, agradeço desde já.

J

Consegui encontrar este post (do próprio ViniGodoy) sobre meu problema.

ViniGodoy:
int viewIndex = jTable1.getSelectedRow(); //índice do que está sendo exibido na tabela int modelIndex = jTable1.convertRowIndexToModel(viewIndex); //Índice do conteúdo dentro do model Cliente c = listCliente.get(modelIndex);

Por essas e outras, é bom ler o javadoc. E também os Tutoriais, e não programar por tentativa e erro.

E claro, [color=red]não usar o DefaultTableModel.[/color]

Segue a resolução caso mais alguém precise:

public Aluno getAlunoDaLinhaSelecionada() {  
		if (table.getSelectedRow() == -1)
			return null;

		int viewIndex = table.getSelectedRow(); //índice do que está sendo exibido na tabela  
		int modelIndex = table.convertRowIndexToModel(viewIndex); //Índice do conteúdo dentro do model  
		
		return TodosAlunos.get(modelIndex);
	}
S

suaTable.setModel(new LivrosTableModel(listaDeLivros));
nesta linha a "listaDeLivros " seria oque ?? que vc esta passando para a tabela??

V

souza_lucas:
suaTable.setModel(new LivrosTableModel(listaDeLivros));
nesta linha a "listaDeLivros " seria oque ?? que vc esta passando para a tabela??

Um List, contendo os livros que você quer que sejam carregados na sua tabela.
Provavelmente essa lista teria sido carregada do seu DAO.

M

boa noite… sei que o tópico é antigo mas a pergunta é pertinente ao assunto…

fiz todo codigo aqui… sem erros no depurador…

mas não to entendendo justamente o método para alterar a jTable dentro do jPanel

o que vai dentro da nova instancia MontadoraTableModel ??

onde coloco esse codigo no jPanel? logo apos o initComponents()?

public MontadoraForm() { initComponents();

só ta faltando isso pra eu botar esse treco pra rodar… e não usar o DefaultTableModel que até funcinou de primeira… mas por recomendação to querendo evitar de usar

segue a classe de entidade de banco de dados:

package oficina;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author Andre
 */
@Entity
@Table(name = "MONTADORA")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Montadora_DB.findAll", query = "SELECT m FROM Montadora_DB m"),
    @NamedQuery(name = "Montadora_DB.findById", query = "SELECT m FROM Montadora_DB m WHERE m.id = :id"),
    @NamedQuery(name = "Montadora_DB.findByMarca", query = "SELECT m FROM Montadora_DB m WHERE m.marca = :marca"),
    @NamedQuery(name = "Montadora_DB.findByService", query = "SELECT m FROM Montadora_DB m WHERE m.service = :service"),
    @NamedQuery(name = "Montadora_DB.findByUsuario", query = "SELECT m FROM Montadora_DB m WHERE m.usuario = :usuario"),
    @NamedQuery(name = "Montadora_DB.findBySenha", query = "SELECT m FROM Montadora_DB m WHERE m.senha = :senha"),
    @NamedQuery(name = "Montadora_DB.findByTel", query = "SELECT m FROM Montadora_DB m WHERE m.tel = :tel"),
    @NamedQuery(name = "Montadora_DB.findByLixo", query = "SELECT m FROM Montadora_DB m WHERE m.lixo = :lixo")})
public class Montadora_DB implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "ID")
    private Integer id;
    @Basic(optional = false)
    @Column(name = "MARCA")
    private String marca;
    @Column(name = "SERVICE")
    private String service;
    @Column(name = "USUARIO")
    private String usuario;
    @Column(name = "SENHA")
    private String senha;
    @Column(name = "TEL")
    private String tel;
    @Basic(optional = false)
    @Column(name = "LIXO")
    private short lixo;

    public Montadora_DB() {
    }

    public Montadora_DB(Integer id) {
        this.id = id;
    }

    public Montadora_DB(Integer id, String marca, short lixo) {
        this.id = id;
        this.marca = marca;
        this.lixo = lixo;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getMarca() {
        return marca;
    }

    public void setMarca(String marca) {
        this.marca = marca;
    }

    public String getService() {
        return service;
    }

    public void setService(String service) {
        this.service = service;
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public short getLixo() {
        return lixo;
    }

    public void setLixo(short lixo) {
        this.lixo = lixo;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Montadora_DB)) {
            return false;
        }
        Montadora_DB other = (Montadora_DB) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "oficina.Montadora_DB[ id=" + id + " ]";
    }
    
}

segue a classe MontadoraTableModel

package oficina;

import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author Andre
 */
public class MontadoraTableModel extends AbstractTableModel {

    private static final int NOME = 0;
    private static final int TELEFONE = 1;
    private static final int SERVICE = 2;
    private static final int USUARIO = 3;
    private static final int SENHA = 4;
    private static final int ID = 5;
    private static final int LIXO = 6;

    private List<Montadora_DB> montadora;

    //Esse é um construtor, que recebe a nossa lista de livros  
    public void MontadoraTableModel(List<Montadora_DB> _montadora) {
        this.montadora = new ArrayList<Montadora_DB>(_montadora);
    }

    public int getRowCount() {
        //Quantas linhas tem sua tabela? Uma para cada item da lista.  
        return montadora.size();
    }

    public int getColumnCount() {
        //Quantas colunas tem a tabela? Nesse exemplo, só 2.  
        return 7;
    }

    public String getColumnName(int column) {
        //Qual é o nome das nossas colunas?  
        switch (column) {
            case NOME:
                return "MONTADORA";
            case TELEFONE:
                return "TELEFONE";
            case SERVICE:
                return "SERVICE";
            case USUARIO:
                return "USUARIO";
            case SENHA:
                return "SENHA";
            case ID:
                return "ID";
            case LIXO:
                return "LIXO";
        }
        /*
         if (column == NOME) {
         return "MONTADORA";
         }
         if (column == TELEFONE) {
         return "TELEFONE";
         }
         if (column == SERVICE) {
         return "TELEFONE";
         }
         if (column == USUARIO) {
         return "USUARIO";
         }
         if (column == SENHA) {
         return "SENHA";
         }
         return ""; //Nunca deve ocorrer  */
        throw new IllegalArgumentException("GetColumnName Inválido!");
    }

    public Object getValueAt(int row, int column) {
        //Precisamos retornar o valor da coluna column e da linha row.  
        Montadora_DB montadora = this.montadora.get(row);

        /*switch (column) {
         case NOME:
         return montadora.getMarca();            
         case TELEFONE:
         return montadora.getTel();             
         case SERVICE:
         return montadora.getService();              
         case USUARIO:
         return montadora.getUsuario();
         case SENHA:
         return montadora.getSenha(); 
         case ID:
         return montadora.getId();
         case LIXO:
         return montadora.getLixo();
         }
         */
        if (column == NOME) {
            return montadora.getMarca();
        } else if (column == TELEFONE) {
            return montadora.getTel();
        } else if (column == SERVICE) {
            return montadora.getService();
        } else if (column == USUARIO) {
            return montadora.getUsuario();
        } else if (column == SENHA) {
            return montadora.getSenha();
        } else if (column == ID) {
            return montadora.getId();
        } else if (column == LIXO) {
            return montadora.getLixo();
        }
        //return ""; //Nunca deve ocorrer  
        throw new IllegalArgumentException("Coluna Inválida");
    }

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        Montadora_DB montadora = this.montadora.get(rowIndex);
        //Vamos alterar o valor da coluna columnIndex na linha rowIndex com o valor aValue passado no parâmetro.  
        //Note que vc poderia alterar 2 campos ao invés de um só.  
        if (columnIndex == NOME) {
            montadora.setMarca(aValue.toString());
        } else if (columnIndex == TELEFONE) {
            montadora.setTel(aValue.toString());
        } else if (columnIndex == SERVICE) {
            montadora.setService(aValue.toString());
        } else if (columnIndex == USUARIO) {
            montadora.setUsuario(aValue.toString());
        } else if (columnIndex == SENHA) {
            montadora.setSenha(aValue.toString());
        } //else if (columnIndex == ID) {
          //  montadora.setId(aValue.toString());
        //} else if (columnIndex == LIXO) {
        //    montadora.setLixo(aValue.toString());
        //}
        
        /*switch (columnIndex) {
         case NOME:
         montadora.setMarca(aValue.toString());
         case TELEFONE:
         montadora.setTel(aValue.toString());
         case SERVICE:
         montadora.setService(aValue.toString());
         case USUARIO:
         montadora.setUsuario(aValue.toString());
         case SENHA:
         montadora.setSenha(aValue.toString());
         case ID:
         //montadora.setId(aValue.toString());
         case LIXO:
         //montadora.setLixo(aValue.toString());

         }*/
        throw new IllegalArgumentException("Coluna Inválida");

    }

    public Class<?> getColumnClass(int columnIndex) {
        //Qual a classe das nossas colunas? Como estamos exibindo texto, é string.  
        /*switch (columnIndex) {
            case 5:
                return Integer.class;
            case 6:
                return Short.class;
        }*/
        return String.class;
    }

    public boolean isCellEditable(int rowIndex, int columnIndex) {
        //Indicamos se a célula da rowIndex e da columnIndex é editável. Nossa tabela toda é.  
        return true;
    }

    //Já que esse tableModel é de livros, vamos fazer um get que retorne um livro inteiro.  
    //Isso elimina a necessidade de chamar o getValueAt() nas telas.   
    public Montadora_DB get(int row) {
        return montadora.get(row);
    }
}
V

Vai a lista de Montadora_DB que você quiser que sua tabela exiba. Por exemplo, pode ser resultado de uma das NamedQueries que você tem aí:

Query query = session.getNamedQuery("Montadora_DB.findAll"); List&lt;Montadora_DB&gt; dados = query.list(); tblLista.setModel(new MontadoraTableModel(dados));

M

grato pela resposta…

to iniciando nessa linguagem…

aonde exatamente eu colocaria esse código?

quais importações eu devo usar?

eu usava muito visualbasic… hehe to lendo muita coisa sobre java mas… já quero por em pratica algumas coisas.

novamente grato por me ajudar a não usar o DefaultTableModel

seria interessante se alguem pudesse disponibilizar um codigo pronto de exemplo funcionando, mas digo completo, talvez até com tabela em derby… assim fica mais facil de entender

Criado 17 de julho de 2009
Ultima resposta 29 de jul. de 2015
Respostas 41
Participantes 14