Controlar entrada no modo de edição da célula na JTable

7 respostas
A

Bom dia pessoal,

Tenho uma tabela (JTable) onde criei uma classe que cuida dos componentes da célula como segue abaixo:

public class EditarCelulaTabelaVendaProduto extends AbstractCellEditor implements TableCellEditor{    
JTextField componente = new JTextField();    
  
public Component getTableCellEditorComponent(JTable table, Object value,    
boolean isSelected, int row, int column ) {    
  
if (isSelected){    
componente.setText(value.toString());    
componente.selectAll();    
}    
  
return componente;    
}    
  
public Object getCellEditorValue() {    
return componente.getText();    
}    
  
}

e utilizo essa classe da seguinte maneira:

EditarCelulaTabelaVendaProduto editor = new EditarCelulaTabelaVendaProduto();    
  
TableColumn tcQuantidade = tbVendaProduto.getColumnModel().getColumn(2);
tcQuantidade.setCellEditor(editor);

até aqui tudo bem funciona corretamente.
Ai eu digito um valor na célula, aperto o enter e vou assim digitando os valores nas células.

O problema é … depois que eu digito um valor na célula e clico com o mouse em qualquer outra célula, a mesma é preenchida com o ultimo valor digitado automaticamente, ou seja, o valor que esta na célula some e é inserido o valor da ultima celula digitada.

Quando eu clico com o mouse a célula entra automaticamente no modo de edição do componente que esta nela.

Como eu posso fazer para somente selecionar a célula clicada e não entrar no modo de edição do componente dela?

Grato.

7 Respostas

gabbardo

Basta pensar ao contrário e GOOGLE IT

Mas esse lance de tu clicar e pegar o ultimo valor, pode ser erro de programação e mesmo tu não editando a célula da JTable com 1 clique, tu está guardando um valor na variável q deveria estar limpa para receber um valor da célular editada. Quem sabe tu revisa a parte q está guardando esses valores dessas celulas editadas para não ficar passando errado para outras celulas.

Abs

A

Opa Gabbardo,

obrigado pela ajuda cara,

então, fiz isto aqui:

public Object getCellEditorValue() {
              
            retorno = componente.getText();
            componente = new JTextField();
            return retorno;
        }

Com isso o componente está retornando o texto normal quando editado, porém agora quando saio da edição e clico com o mouse encima da célula o seu valor é apagado.

Tem como não deixar entrar no modo de edição quando se clica na célula, ou somente deixar entrar quando der 2 cliques?

Desde ja agradeço a ajuda.

gabbardo

Então, é possível sim. Basta sobrescrever o metodo isCellEditable do JTable para retornar false.

JTable table = new JTable() {
	public boolean isCellEditable(int row, int column) {
		return false;
	}
};

Com isso a célula não é editada no clique.
Em seguida para fazer com que o duplo-clique edite a célula, tu vai precisar sobrescrever o método mouseClicked na classe MouseInputListener da tabela. Para isso tu criar um custom listener.

table.addMouseListener(new MouseAdapter() {
	public void mouseClicked(MouseEvent e) {
		if (e.getClickCount() == 2) {
			System.out.println("DUPLO CLIQUE");
		}
	}
});

Tenta isso, pois q eu lembre foi assim q fiz da ultima vez.
Acho q se procurar no google como usar duplo clique na JTable tu vai achar exemplos.

A

Bom dia Gabbardo,

tentei implementar sua dica desta maneira e nao deu certo veja:

DefaultTableModel model = new DefaultTableModel(){
            public boolean isCellEditable(int rowIndex, int mColIndex) {
                    return false;
            };
tbVendaProduto.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked (MouseEvent e){
                if (e.getClickCount() == 2){
                    if (tbVendaProduto.getSelectedColumn() == 2)
                    tbVendaProduto.setEditingColumn(2);
                }
                
            }
        });

Gostaria apenas de que quando eu clicasse na celula o componente (JTextField) que esta dentro da celula não entrasse em modo de edição e sim somente selecionasse a celula.
Tem como fazer isso?

Grato novamente.

gabbardo

Então cara… se tu quer só selecionar a célula em vez de criar algum edit com duplo clique basta retornar false no isCellEditable e não criar nenhum mouse listener. Faz como eu disse:

JTable table = new JTable() {  
    public boolean isCellEditable(int row, int column) {  
        return false;  
    }  
};

Tu fez com DefaultTableModel e não foi assim que eu mostrei. Tem q sobrescrever do JTABLE.
O DefaultTableModel tu passa no construtor do JTable. Oq acho estranho é q testei aqui e sem sobrescrever o isCellEditable da tabela eu só edito uma celula se selecionar ela e depois clicar novamente em cima. Não abre para edição só por selecionar. Não sei oq tu fez ai para abrir a edição só clicando em cima. Tem q verificar melhor.

E eu não implementei para ti a parte de editar com duplo clique, eu te mostrei como criar o listener.
Agora é contigo criar a edição se precisar. Qualquer coisa clia uma classe de teste ai com um main e implementa um JFrame passando um JTable com essa configuração para testar. Ai depois q tiver ok tu vai para tua aplicação.
Boa sorte.

A

Opa, gabbardo, consegui fazer o seguinte:

tirei o if (isSelectd) la da minha verificação e funcionou normalmente agora.

acho que quando estava selecionado ele entrava direto … então tirei aqulo de la e funcionou blz

Valew pelo apoio .

gabbardo

Beleza! No final tudo se resolve.

Abs

Criado 3 de outubro de 2011
Ultima resposta 4 de out. de 2011
Respostas 7
Participantes 2