Como tornar um JTable não editável

Respostas:

22

Você pode usar um TableModel.

Defina uma classe assim:

public class MyModel extends AbstractTableModel{
    //not necessary
}

na verdade, isCellEditable()é falsepor 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 seu JTable.

JTable myTable = new JTable();
myTable.setModel(new MyModel());
JCasso
fonte
1
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:

//instance table model
DefaultTableModel tableModel = new DefaultTableModel() {

    @Override
    public boolean isCellEditable(int row, int column) {
       //all cells false
       return false;
    }
};

table.setModel(tableModel);

ou

//instance table model
DefaultTableModel tableModel = new DefaultTableModel() {

   @Override
   public boolean isCellEditable(int row, int column) {
       //Only the third column
       return column == 3;
   }
};

table.setModel(tableModel);

Nota para se o seu JTable desaparecer

Se o seu JTableestiver desaparecendo quando você usar isso, é mais provável que você precise usar o DefaultTableModel(Object[][] data, Object[] columnNames)construtor.

//instance table model
DefaultTableModel tableModel = new DefaultTableModel(data, columnNames) {

    @Override
    public boolean isCellEditable(int row, int column) {
       //all cells false
       return false;
    }
};

table.setModel(tableModel);
nelson eldoro
fonte
3
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".
user1164199
49
table.setDefaultEditor(Object.class, null);
Oleg Mikhailov
fonte
2
Esta é a melhor e mais fácil resposta. Claro, você deve definir o editor como nulo para que não seja capaz de editá-lo.
LEMUEL ADANE
Isso funciona muito bem com uma única seleção. Qual foi o meu requisito.
Wesos de Queso
Esta deve ser a RESPOSTA!
KrishPrabakar de
36

apenas adicione

table.setEnabled(false);

Isso funciona bem para mim.

Siddhu
fonte
1
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 = new JTable(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
}

Sem editores, os dados não serão editáveis.

freesoft
fonte
4
-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.

JTable myTable = new JTable();
myTable.setEnabled(false);
user3518835
fonte
2
A seleção não será possível.
h3xStream
Solução simples e agradável
Nuwan Harshakumara Piyarathna
A pergunta é sobre editável não habilitado. Habilitar não resolve o propósito
shaILU
2

crie uma nova classe DefaultCellEditor:

public static class Editor_name extends DefaultCellEditor {
  public Editor_name(JCheckBox checkBox) {
   super(checkBox);
  }
  @Override
  public boolean isCellEditable(EventObject anEvent) {
    return false;
  }
}

e use setCellEditor:

JTable table = new JTable();
table.getColumn("columnName").setCellEditor(new Editor_name(new JCheckBox()));
Ehsan Jelodar
fonte