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

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

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

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.


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.


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

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()));
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.