Apagar conteúdo de uma celula do JTable ao digitar um valor

10 respostas
B

Olá,

Estou com uma dúvida em relação a manipulação de informações em um JTable.

Gostaria que ao digitar um valor em uma célula, o sistema apagasse o valor que já estava na celula.

Por default do Jtable, ao digitar o novo valor, ele incrementa com o valor que já estava na célula.

Alguém saberia me dizer como fazer isso

10 Respostas

julianofischer

Usa um KeyListener.

Fernando_Generoso_da

Acredito que a maneira de fazer isso é através do TableCellEditor. Por default, uma célula utiliza o JTextField como componente. Utilizando um Custom TableCellEditor, você pega esse JTextField e implementa um focusListener…Nunca testei isso, mas acho que esse é o caminho.

Como diria Cleber Machado…“Pode dar certo, ou não” :lol:

Fernando_Generoso_da

funciona…

Segue um trecho de código:

table = new JTable(dados, colunas);
		scroll.setViewportView(table);

		TableColumn column = table.getColumnModel().getColumn(0);

		JTextField fieldEditor = new JTextField();
		fieldEditor.addFocusListener(new FocusListener() {
			@Override
			public void focusGained(FocusEvent e) {
				((JTextField) e.getSource()).setText("");

			}

			@Override
			public void focusLost(FocusEvent e) {
				// TODO Auto-generated method stub

			}
		});

		CustomCellEditor cellEditor = new CustomCellEditor(fieldEditor);
		column.setCellEditor(cellEditor);

O CustomCellEditor:

public class CustomCellEditor extends DefaultCellEditor {

	public CustomCellEditor(JTextField textField) {
		super(textField);
	}

}
M
Fernando Generoso da Rosa:
funciona....

Segue um trecho de código:

table = new JTable(dados, colunas);
		scroll.setViewportView(table);

		TableColumn column = table.getColumnModel().getColumn(0);

		JTextField fieldEditor = new JTextField();
		fieldEditor.addFocusListener(new FocusListener() {
			@Override
			public void focusGained(FocusEvent e) {
				((JTextField) e.getSource()).setText("");

			}

			@Override
			public void focusLost(FocusEvent e) {
				// TODO Auto-generated method stub

			}
		});

		CustomCellEditor cellEditor = new CustomCellEditor(fieldEditor);
		column.setCellEditor(cellEditor);

O CustomCellEditor:

public class CustomCellEditor extends DefaultCellEditor {

	public CustomCellEditor(JTextField textField) {
		super(textField);
	}

}
Para que um CustomCellEditor se ele não faz absolutamente nada além do que a superclasse já faz?
Fernando_Generoso_da
marcobiscaro2112:
Fernando Generoso da Rosa:
funciona....

Segue um trecho de código:

table = new JTable(dados, colunas);
		scroll.setViewportView(table);

		TableColumn column = table.getColumnModel().getColumn(0);

		JTextField fieldEditor = new JTextField();
		fieldEditor.addFocusListener(new FocusListener() {
			@Override
			public void focusGained(FocusEvent e) {
				((JTextField) e.getSource()).setText("");

			}

			@Override
			public void focusLost(FocusEvent e) {
				// TODO Auto-generated method stub

			}
		});

		CustomCellEditor cellEditor = new CustomCellEditor(fieldEditor);
		column.setCellEditor(cellEditor);

O CustomCellEditor:

public class CustomCellEditor extends DefaultCellEditor {

	public CustomCellEditor(JTextField textField) {
		super(textField);
	}

}
Para que um CustomCellEditor se ele não faz absolutamente nada além do que a superclasse já faz?

Como tu faria para adicionar o listener necessário no componente do cellEditor??

M

Por que ele precisa ser adicionado no CellEditor? Não poderia ser adicionado logo após a instanciação?

Ainda sim, nenhum listener é adicionado nesse CellEditor. Ele simplesmente chama o método da superclasse (por isso mesmo comentei: qual a utilidade de uma classe assim?).

Fernando_Generoso_da

Eu customizei o componente que é utilizado pelo CellEditor (JTextField) e adicionei NESSE componente o listener que trata adequadamente o que nosso colega necessita. Agora pode ter outras formas de fazer, e estaria muito interessado e curioso de ver como você faria, marcobiscaro2112.

M

Trocando as duas últimas linhas da primeira classe por:

column.setCellEditor(new DefaultCellEditor(cellEditor));

Com isso a outra classe nem precisa existir, concorda?

Fernando_Generoso_da

concordo

B

Pessoal, primeiramente queria agradecer, pois implementei da maneira descrita por vocês e deu certo.

Porém, tenho outra dúvida em relação a isso. Percebi que ele limpa a célula somente se eu clicar em cima dela com o mouse. Está certo pois ele limpa o campo no FocusGained (quando recebe o foco).

Como eu faço para limpar o campo se o usuário for para a célula pelas setas do teclado e já digitar o valor novo em cima da célula. Percebi que ele não substitui fazendo dessa maneira.

Tentei implementar um KeyListener, porém ele limpa o campo a cada dígito que eu insiro. O que estou fazendo de errado?

Criado 4 de fevereiro de 2010
Ultima resposta 5 de fev. de 2010
Respostas 10
Participantes 4