Bloquear edição de células em jTable

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:

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];
                }
            });
1 curtida

: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:

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.

1 curtida

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.

:shock: :shock: :shock:

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

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.

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

:thumbup: :thumbup: :thumbup:

[quote=Eder Peixoto]Haaa… Errei na quantidade dos false na variável

Só muda o canEdit.[/quote]

O que vc quer dizer com isto?

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í.

O pior é que não dispara exception nenhuma…

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

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

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:

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…

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:

[quote=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.

[code]
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];
            }
        });

[/code][/quote]

Opa blz deu certo!