[Resolvido] Manter texto fixo em JTextField habilitado

7 respostas
V

Olá pessoal,

Uma pequena dúvida,

Insiro um texto em um JTextField. Logo quero deixar o campo habilitado para eventos (KeyEvent) e não quero que o usuário apague o texto inserido.

Se deixo o campo habilitado (setEnabled(true) ou mesmo setEditable(true)) os eventos ficam disponíveis, mas a string pode ser apagada a qualquer momento.
Se deixo por sua vez, o mesmo desabilitado, o texto é travado, mas não se pode executar o evento.

Resumindo: Fica ou 0 ou 100%. Eu quero 50% entendem?. Sugestões?

Desde já agradeço,
Um abraço.

7 Respostas

A

vigmonster:
Olá pessoal,

Uma pequena dúvida,

Insiro um texto em um JTextField. Logo quero deixar o campo habilitado para eventos (KeyEvent) e não quero que o usuário apague o texto inserido.

Se deixo o campo habilitado (setEnabled(true) ou mesmo setEditable(true)) os eventos ficam disponíveis, mas a string pode ser apagada a qualquer momento.
Se deixo por sua vez, o mesmo desabilitado, o texto é travado, mas não se pode executar o evento.

Resumindo: Fica ou 0 ou 100%. Eu quero 50% entendem?. Sugestões?

Desde já agradeço,
Um abraço.

vc nao quer que a string seja apagada, e sim somente inserida?

V

Olá Anderson, é isso mesmo.

A

Bom, vc pode fazer um plainDocument para seu JTextField que não deixa apagar o conteúdo… e se caso apagar vc pode colocá-lo novamente…

aqui ensina como vc editar isso: http://www.guj.com.br/articles/29
Com as manipulações de string vc conseguirá isso facilmente… ou também pode criar o evento key, para bloquear as teclas delete e bakcspace, espero ter ajudado, boa sorte =]

F

Você pode usar Filtro para ter melhor controle em relação ao texto do JTextField...

Vai um exemplo a baixo de como usar...

private JTextField campoComTextoFixo = new JTextField(20);
.
.
.
campoComTextoFixo.setText("TextoFixo");

AbstractDocument doc = (AbstractDocument) campoComTextoFixo.getDocument();
        doc.setDocumentFilter(new DocumentFilter()
        {
        	@Override
        	public void insertString(FilterBypass fb, int offset,
        			String string, AttributeSet attr)
        			throws BadLocationException {

        	if ((fb.getDocument().getLength() < "TextoFixo".length()))
                    super.insertString(fb, offset, "TextoFixo", attr);
                else
                    Toolkit.getDefaultToolkit().beep();
        	}
        	
        	@Override
        	public void replace(FilterBypass fb, int offset, int length,
        			String text, AttributeSet attrs)
        			throws BadLocationException {
        		
        		if ((fb.getDocument().getLength() < "TextoFixo".length()))
                    super.replace(fb, offset, length, "TextoFixo", attrs);
                else
                    Toolkit.getDefaultToolkit().beep();
        	}
        	
        	@Override
        	public void remove(FilterBypass fb, int offset, int length)
        			throws BadLocationException {
        		
        		//super.remove(fb, offset, length);
        	}
        });
    }

Como uso pouco esse recurso e ainda fiz no improviso, não é dos melhores exemplos, mas funciona....

E

O caminho é implementar um Document, como o Anderson citou. O método que deve ser sobrescrito é o remove, que é o responsável por remover o conteúdo do text field.

Aqui tem exemplos utilizando o método insertString, responsável por inserir o texto. No seu caso teria que implementar o remove para não fazer nada, ou não remover o texto sob determinadas condições, aí vai da sua necessidade.

Bloquear as teclas backspace e delete por evento não funcionaria em 100% dos casos, pois ainda não impediria um Ctrl + X, ou que recortasse o texto com o mouse.

Correção: O método que deve ser implementado é o remove, como o do exemplo do Francisco, e não removeString como eu havia dito.

V

Consegui aqui um jeito de bloquear: Backspace, delete e ctrl + X.
Ta redondo. Obrigado pelas dicas.
Até a próxima

A

Eric Yuzo:

Bloquear as teclas backspace e delete por evento não funcionaria em 100% dos casos, pois ainda não impediria um Ctrl + X, ou que recortasse o texto com o mouse.

ah eh verdade… tinha esquecido desse detalhe 8)
o caminho é editar os dois métodos mesmo como foi dito, good luck

Criado 22 de janeiro de 2011
Ultima resposta 22 de jan. de 2011
Respostas 7
Participantes 4