Bloquear edição de células em jTable

15 respostas
G

Como faço para bloquear a edição das células (todas) em um jTable? Parece simples, usa setEnable (false); mas daí não consigo ponterar o registro (selecionar a linha), não existe setEditable() para tabelas.

scrollTableGaragem = new JScrollPane();
		tableGaragem = new JTable();
		tableGaragem.setModel(new DefaultTableModel(
				new Object [][] { },
				new String [] {"Placa", "Hora", "Data", "Veículo", "Funcionário"})
		
		);
tableGaragem.getTableHeader().setReorderingAllowed(false);
		scrollTableGaragem.setLocation(2,15);

A delaração da table e da scrollTable estão no início da classe, o scrollTable é add em um painel mas a diante.
Tudo funciona perfeitamente.

Valeu gente! :thumbup:

15 Respostas

E

Abaixo consta um exemplo de como sobrescrever a classe DefaultTableModel.
Você define a edição ou não das células de uma coluna através da variável boolean[] canEdit.

this.jTable.setModel( new javax.swing.table.DefaultTableModel(dados, this.TITLE_COLUMN){
                Class[] types = new Class[]{Integer.class, String.class};

                boolean[] canEdit = new boolean []{
                    false, false
                };

                @Override
                public Class getColumnClass(int columnIndex) {
                    return types [columnIndex];
                }

                @Override
                public boolean isCellEditable(int rowIndex, int columnIndex) {
                    return canEdit [columnIndex];
                }
            });
G

:shock: :shock: :shock:
O seu código está um pouco complicado para entender, teria como você me explicar o que faz cada parte e me mostrar como ficaria na minha atual tabela?

Valeu! :thumbup:

E

O teu exemplo ficaria assim:

scrollTableGaragem = new JScrollPane();
tableGaragem = new JTable();  
tableGaragem.setModel(new DefaultTableModel(  
    new Object [][] { },  
    new String [] {"Placa", "Hora", "Data", "Veículo", "Funcionário"}){

        boolean[] canEdit = new boolean []{  
            false, false, false, false
        };  
   
        @Override  
        public boolean isCellEditable(int rowIndex, int columnIndex) {  
            return canEdit [columnIndex];  
        }
});
tableGaragem.getTableHeader().setReorderingAllowed(false);  
scrollTableGaragem.setLocation(2,15);

Cada valor da variável canEdit representa uma coluna. Se informar true, todas células da coluna permitem serem editadas; se false, não.

E

Por padrão, a classe DefaultTableModel define que as células de cada coluna são editáveis. Se você quiser que alguma coluna NÃO seja editada, é necessário sobrescrever algumas coisas dentro dela. No nosso caso, é necessário editar a variável canEdit e o método isCellEditable.

Espero ter ajudado.

G

:shock: :shock: :shock:

Até que não deu erro de compilação mas a tabela desapareceu!

E

Haaa… Errei na quantidade dos false na variável canEdit Coloquei 4, mas são 5.

Fica assim:

scrollTableGaragem = new JScrollPane();  
tableGaragem = new JTable();    
tableGaragem.setModel(new DefaultTableModel(    
     new Object [][] { },    
     new String [] {"Placa", "Hora", "Data", "Veículo", "Funcionário"}){  
   
         boolean[] canEdit = new boolean []{    
             false, false, false, false, false
         };    
      
         @Override    
         public boolean isCellEditable(int rowIndex, int columnIndex) {    
             return canEdit [columnIndex];    
         }  
 });  
tableGaragem.getTableHeader().setReorderingAllowed(false);    
scrollTableGaragem.setLocation(2,15);

Só muda o canEdit.

G

Cara, a tabela continua desaparecendo. Desculpa a minha ignorância, é que sou leigo em jTable e estou apanhnado com elas!

:thumbup: :thumbup: :thumbup:

G

Eder Peixoto:
Haaa… Errei na quantidade dos false na variável

Só muda o canEdit.

O que vc quer dizer com isto?

E

Como tua tabela possui 5 colunas, então é necessário informar que todas NÃO serão editáveis. Para fazer isso, você informa na variável canEdit um array de tamanho 5, sendo todos parâmetros false.

boolean[] canEdit = new boolean []{ false, false, false, false, false };

O problema é que eu tinha te informado que canEdit recebia 4 elementos false.

Por acaso está disparando alguma Exception? Se NÃO, coloque o método setmodel dentro de um bloco try/catch, e utilize o método printStackTrace para verificar o que está ocorrendo.

Se continuar o problema, poste-o aí.

G

O pior é que não dispara exception nenhuma…

:?: :?: :?: :?: :?:

E

Não testei, mas o problema pode ser aqui:

new Object [][] { }

Tente colocá-lo como null, para ver se o problema persiste.

Ficaria assim:

scrollTableGaragem = new JScrollPane();    
tableGaragem = new JTable();      
tableGaragem.setModel(new DefaultTableModel(      
    null, 
    new String [] {"Placa", "Hora", "Data", "Veículo", "Funcionário"}){    
    
    boolean[] canEdit = new boolean []{ false, false, false, false, false };      

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {      
        return canEdit [columnIndex];      
    }    
});    
tableGaragem.getTableHeader().setReorderingAllowed(false);      
scrollTableGaragem.setLocation(2,15);
G

Rodou aqui!!!

Estava faltando isto: scrollTableGaragem.setViewportView(tableGaragem);

Foi mau cara…Me desculpa ai e muito obrigado pela paciência e ajuda!

Valeu Eder Peixoto :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup:

E

Que nada, o fórum é pra isso.
E o bom é que também estou agora quebrando a cabeça pra fazer com que o meu JTable inicie com a largura de uma determinada coluna, com o tamanho que eu quiser (por exemplo: coluna 0 (zero), deve iniciar com tamanho 40).

Até mais…

G
table.getColumnModel().getColumn(0).setPreferredWidth(50);
table.getColumnModel().getColumn(0).setResizable(false);

Onde table é o nome da sua tabela, o número do getColumn() é o índice da sua coluna.
Também coloquei ai como travar o reSize de uma coluna.

Adiciona isso depois daquilo tudo que fizemos.

Até ! :thumbup: :thumbup: :thumbup:

W
Eder Peixoto:
Abaixo consta um exemplo de como sobrescrever a classe DefaultTableModel. Você define a edição ou não das células de uma coluna através da variável
boolean[] canEdit
.
this.jTable.setModel( new javax.swing.table.DefaultTableModel(dados, this.TITLE_COLUMN){
                Class[] types = new Class[]{Integer.class, String.class};

                boolean[] canEdit = new boolean []{
                    false, false
                };

                @Override
                public Class getColumnClass(int columnIndex) {
                    return types [columnIndex];
                }

                @Override
                public boolean isCellEditable(int rowIndex, int columnIndex) {
                    return canEdit [columnIndex];
                }
            });

Opa blz deu certo!

Criado 9 de janeiro de 2009
Ultima resposta 1 de jun. de 2011
Respostas 15
Participantes 3