JTable - Não permitir edição

27 respostas
khaue_viana_

Pessoal como faço pra não permitir a edição de uma JTable. Sei que tem outras alternativa, mas quero usar JTABLE, pq é mais facil pra mim.

Utilizo Netbeans!

Abraços a todos.

27 Respostas

Eric_Yuzo

O método isCellEditable de seu TableModel deve retornar false. Assim a JTable não poderá ser editada.

khaue_viana_

Tendi

ai vo ter que fazer um for nas linhas?

sera que num uma propriedade que faria isso em todo o objeto de uma vez?

vlw kra, brigadão

Eric_Yuzo

Não precisa fazer nenhum laço, basta que o seu Table Model retorne false no método isCellEditable. Aliás o próprio AbstractTableModel já faz esta implementação. Se implementar um TableModel que estende AbstractTableModel, a edição já estará bloqueada.

Agora se estiver usando DefaultTableModel, acho que usar a JTable não será tarefa fácil como disse no primeiro post.

Quanto a propriedade no Net Beans eu desconheço, mas é provável que exista.

khaue_viana_

tendi :confused:

vlw kra

khaue_viana_

Sera que mais alguem pode me ajudar, com esse problema :confused:

Abraços pessoal e agradeço a ajuda!

Marky.Vasconcelos

A resposta é exatamente isso mesmo.

O método isCellEditable do seu TableModel deve retornar false.

khaue_viana_

Blz vlw

flwwwwwwwww

ViniGodoy

Como está implementado o seu TableModel?

khaue_viana_

ixi to usando DefaultTableModel :smiley:

ViniGodoy

Insistindo no erro?

Acho que o Mark já tinha te falado para sair do Default naquele outro tópico que vc criou sobre esconder colunas, não?

Não é possível deixar colunas não editáveis no DefaultTableModel. Você teria que estende-lo, e sobrescrever o método isCellEditable.
Agora, o ideal mesmo, é você aprender a usar o JTable corretamente.

khaue_viana_

É to ligado, eu consegui aqui sobrescrever o método isCellEditable, mas eu ainda vou usar a tabela corretamente. Vlw kra

RenanRosa

Cara eu acho que ninguem foi claro falando apenas do “isCellEditable”
o que tem que fazer é criar uma classe que herda do DefaultTableModel
ai no metodo isCellEditable você sobrescreve, adicionando apenas “return false”
e depois em vez de usar o DTM você usa sua classe.

khaue_viana_

uhum, tendi, mas ja consegui fazer aqui. Vlww

ViniGodoy

RenanRosa:
Cara eu acho que ninguem foi claro falando apenas do “isCellEditable”
o que tem que fazer é criar uma classe que herda do DefaultTableModel
ai no metodo isCellEditable você sobrescreve, adicionando apenas “return false”
e depois em vez de usar o DTM você usa sua classe.

O ideal é herdar de AbstractTableModel e não de [color=red]DefaultTableModel[/color].

O DefaultTableModel tem tantos problemas, mas tantos problemas, que não vale a pena ser utilizado.
Não é à toa que na assinatura de praticamente todos desse post, pedimos encarecidamente para não utilizar o Default.

RenanRosa

verdade, esqueci, mas apenas quis citar a questão da herança e sabia que alguem ia falar isso :smiley:
valeu pelo reforço

khaue_viana_

Mas a forma de eu utilizar o AbstractTableModel é o mesmo que o DefaultTableModel? Ai só mudaria o objeto utilizado e claro todas as vantagens que o GUJ tem pregado.

Eric_Yuzo

A utilização de um table model próprio é bem mais simples do que um defaultTableModel.

Aqui tem um exemplo: http://www.guj.com.br/java/149861-recuperar-id-de-jtable/2#1174128.

AssemblyXP

ViniGodoy:

O ideal é herdar de AbstractTableModel e não de [color=red]DefaultTableModel[/color].

O DefaultTableModel tem tantos problemas, mas tantos problemas, que não vale a pena ser utilizado.
Não é à toa que na assinatura de praticamente todos desse post, pedimos encarecidamente para não utilizar o Default.

vinny… blz… eu já uso há um tempo o AbstractTableModel.

porém… estou com o problema de esconder a coluna. sabe alguma forma?

tentei no:

public int getColumnCount() {
		return 6;
	}

e colocando “” no:

public String getColumnName(int coluna) {

		switch (coluna) {
		case 0:
			return "Cod.";  <---< Aqui coloco ""
			(...)

mais não funcionou…

RenanRosa

AssemblyXP

poois é ne… so que as dúvidas ainda existem…tem uma galera ai que ressucita tópicos de beem antes

RenanRosa

Não tem problema desenterrar tópico, o problema é desenterrar para uma dúvida que não tem haver com o assunto.
Esconder uma coluna não tem nada haver com não permitir edição.

mas vamos lá, terá que acessar o model das colunas para isso.

TableColumn columnHiddenFila = tbl.getColumnModel().getColumn(indice_da_sua_coluna);

columnHiddenFila.setMinWidth(0);

columnHiddenFila.setMaxWidth(0);

columnHiddenFila.setPreferredWidth(0);
RenanRosa

Não tem problema desenterrar tópico, o problema é desenterrar para uma dúvida que não tem haver com o assunto.
Esconder uma coluna não tem nada haver com não permitir edição.

mas vamos lá, terá que acessar o model das colunas para isso.

TableColumn columnHiddenFila = tbl.getColumnModel().getColumn(indice_da_sua_coluna);

columnHiddenFila.setMinWidth(0);

columnHiddenFila.setMaxWidth(0);

columnHiddenFila.setPreferredWidth(0);
AssemblyXP

RenanRosa:
Não tem problema desenterrar tópico, o problema é desenterrar para uma dúvida que não tem haver com o assunto.
Esconder uma coluna não tem nada haver com não permitir edição.

mas vamos lá, terá que acessar o model das colunas para isso.

TableColumn columnHiddenFila = tbl.getColumnModel().getColumn(indice_da_sua_coluna);

columnHiddenFila.setMinWidth(0);

columnHiddenFila.setMaxWidth(0);

columnHiddenFila.setPreferredWidth(0);</blockquote>

Muito obrigado pela resposta…

porém, sua resposta está totalmente ORIENTADA A POG. Não tem nada a ver, foge totalmente do conceito de orientação a objeto

eu não sei a solução, mais essa dai não resolve meu problema, o dado ainda fica aparecendo em ‘entrelinhas’(…)

sei que tem um meio, pq não pode aparecer a coluna, trabalho com 2 TABELAS em uma tela, e atualizadas em tempo real.

grato.
Att. Pedro Europeu

RenanRosa

Realmente é uma gambiarra, mas desconheço uma forma de fazer isso, normalmente se quer esconder uma coluna, apenas não coloca ela.

ViniGodoy

Você teria que:

  1. Retorna 1 a menos no getColumnCount();
  2. Fazer o getValueAt não considerar a coluna.
  3. Disparar um fireTableStructureChanged cada vez que a coluna caísse fora.

Uma alternativa mais elegante seria programar uma extensão do seu ColumnModel, que escondesse colunas. Essa alternativa está descrita aqui:
http://www.stephenkelvin.de/XTableColumnModel/

AssemblyXP

ViniGodoy:
Você teria que:

  1. Retorna 1 a menos no getColumnCount();
  2. Fazer o getValueAt não considerar a coluna.
  3. Disparar um fireTableStructureChanged cada vez que a coluna caísse fora.

Uma alternativa mais elegante seria programar uma extensão do seu ColumnModel, que escondesse colunas. Essa alternativa está descrita aqui:
http://www.stephenkelvin.de/XTableColumnModel/

Obrigado Vinny. Mais uma vez ajudando a moçada ai…

Ficou bem interessante, apenas importei as duas classes para minha aplicação, observei o que elas faziam, e retirei somente o que eu precisava para minha implementação.

ficou óotimo. RENAN ROSA > Se ainda precisar, essa solução ai é bem interessante e simples!

valew…

AssemblyXP

ViniGodoy:
Você teria que:

  1. Retorna 1 a menos no getColumnCount();
  2. Fazer o getValueAt não considerar a coluna.
  3. Disparar um fireTableStructureChanged cada vez que a coluna caísse fora.

Uma alternativa mais elegante seria programar uma extensão do seu ColumnModel, que escondesse colunas. Essa alternativa está descrita aqui:
http://www.stephenkelvin.de/XTableColumnModel/

Só mais uma coisa vinny, se puder, eu usava uma outra classe em minha TableModel para centralizar o conteúdo do registro, o nome da coluna e talz.

//1° PARTE

DefaultTableCellRenderer centralizado = new DefaultTableCellRenderer();  
		centralizado.setHorizontalAlignment(SwingConstants.CENTER);  
		tabela.getColumnModel().getColumn(0).setCellRenderer(centralizado);
		tabela.getColumnModel().getColumn(0).setMaxWidth(50);  
		tabela.getColumnModel().getColumn(0).setMinWidth(50);

Mais depois que eu coloquei essa parte do código:

//2° PARTE

tabela.setColumnModel(columnModel);
		tabela.createDefaultColumnsFromModel();
		TableColumn column  = columnModel.getColumnByModelIndex(0);
        columnModel.setColumnVisible(column, !columnModel.isColumnVisible(column));

não está dando mais para usar os efeitos desta outra implementação.

tem alguma idéia?
Obs.: Coloco a 2° PARTE depois da 1° PARTE.

Criado 11 de janeiro de 2011
Ultima resposta 2 de abr. de 2012
Respostas 27
Participantes 6