Você não pode fazer com que um public voidmétodo retorne um booleano.
Geo
1
Além disso, o método éisCellEditable
Matt
Embora a abordagem que você especifica funcione, não existe um método como isEditable em AbstractTableModel. O que existe é o método isCellEditable (int, int) que leva rowIndex e coulmnIndex como parâmetros. O usuário pode ativar / desativar seletivamente a edição de uma linha / coluna específica, substituindo o método "isCellEditable" ou pode usar a implementação padrão para desativar a edição de todas as células.
sateesh
150
Você pode substituir o método isCellEditable e implementar como quiser, por exemplo:
Esta também é a solução para fazer eventos de clique duplo funcionarem corretamente com JTable. Um clique duplo é normalmente consumido por uma célula ao entrar no modo de edição, e isso impedirá que uma célula faça isso e, em vez disso, enviará o clique duplo para o próprio JTable. Obrigado pela solução, Nelson!
anacoreta de
2
@Jop então algo está errado em outro lugar em seu código - uma tabela nunca desaparece apenas porque o modelo da tabela não é editável ...
kleopatra
1
@DougHauf parece que você não conhece Java, ou realmente nenhuma linguagem tão bem, já que a maioria das linguagens usa a mesma sintaxe para operações booleanas ... que retorna um booleano ... Eu recomendaria que você encontrasse um Java muito básico tutorial e comece do início. Tentar entrar em ação assim vai acabar com você aprendendo tudo errado.
searchengine27
1
@DougHauf, o == é um alias para a função Equals que compara os objetos (à esquerda e à direita) e retorna um booleano. Suponho que você tenha usado a instrução se avalia booleanos e geralmente é usada com esse tipo de expressão, por exemplo, se (a == b) fizer algo. Tente imprimir a == b ou apenas atribua isso a uma variável e entenda o resultado.
nelson eldoro,
1
A correção acima também não funciona para mim. Isso faz com que a coluna da tabela e os elementos de dados desapareçam. Minha tabela é criada com table = new JTable (tempTable, columnNames) ;, onde tempTable é uma String [] [] e Column Names é uma String []. Acredito que o problema seja causado por new DefaultTableModel () não especificando os dados e nomes de coluna para o modelo de tabela. Como faço para especificar no modelo de dados. Tentei table.setModel (tableModel (tempTable, columnNames)) ;, mas isso causou um erro "não foi possível encontrar o símbolo".
Isso é ótimo se você não estiver usando um modelo de mesa personalizado!
Kingsolmn
26
Mas você não poderá selecionar uma célula ou linha.
tianz
3
Isso ficará "acinzentado" em alguns L&F.
Stommestack de
2
Isso funciona. Obrigado. No entanto, ainda gostaria de saber por que o método de modelo de dados de Nelson faz com que a coluna da tabela e os elementos de dados desapareçam.
user1164199
1
Funciona bem para mim!
Colby Cox
10
Se você estiver criando o TableModel automaticamente a partir de um conjunto de valores (com "new JTable (Vector, Vector)"), talvez seja mais fácil remover editores de colunas:
JTable table =newJTable(my_rows, my_header);for(int c =0; c < table.getColumnCount(); c++){Class<?> col_class = table.getColumnClass(c);
table.setDefaultEditor(col_class,null);// remove editor}
-1 hackear aleatoriamente em locais inadequados nunca é uma opção
Kleopatra
Por favor, você pode explicar porque é um "hacking aleatório em locais inadequados"? De acordo com o documento setDefaultEditor () : "Se o editor for nulo, remove o editor padrão para esta classe de coluna."
freesoft
sim, e volta ao padrão para Object ;-) Então você realmente não desabilita a edição (apenas acidentalmente se uma das colunas for do tipo Object), também está faltando alguma coluna que possa ter um editor personalizado. Há uma API feita para ser implementada para controlar a capacidade de edição da célula, e essa é a do modelo. Todo o resto é hackeado e, como tal, inapropriado.
kleopatra
Eu vejo seu ponto. Mas o que entendi da api é que, se eu criar uma tabela de maneira rápida (com "new JTable (Vector, Vector)"), a tabela terá editores padrão para todas as suas colunas. Portanto, se eu executar "table.setDefaultEditor (column, null)", removerei o editor padrão da coluna, de modo que a coluna não terá nenhum editor e não será editável. Vai ser?
freesoft
Eu criei a mesa dessa forma new JTable(Vector, Vector)e funcionou para mim. Não preciso de editor em nenhuma célula, então você tem meu voto.
Dani Sancas
3
Eu usei isso e funcionou: é muito simples e funciona bem.
Respostas:
Você pode usar um
TableModel
.Defina uma classe assim:
na verdade,
isCellEditable()
éfalse
por padrão, então você pode omiti-lo. (consulte: http://docs.oracle.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html )Em seguida, use o
setModel()
método de seuJTable
.fonte
public void
método retorne um booleano.isCellEditable
Você pode substituir o método isCellEditable e implementar como quiser, por exemplo:
ou
Nota para se o seu JTable desaparecer
Se o seu
JTable
estiver desaparecendo quando você usar isso, é mais provável que você precise usar oDefaultTableModel(Object[][] data, Object[] columnNames)
construtor.fonte
fonte
apenas adicione
Isso funciona bem para mim.
fonte
Se você estiver criando o TableModel automaticamente a partir de um conjunto de valores (com "new JTable (Vector, Vector)"), talvez seja mais fácil remover editores de colunas:
Sem editores, os dados não serão editáveis.
fonte
new JTable(Vector, Vector)
e funcionou para mim. Não preciso de editor em nenhuma célula, então você tem meu voto.Eu usei isso e funcionou: é muito simples e funciona bem.
fonte
crie uma nova classe DefaultCellEditor:
e use setCellEditor:
fonte