[Resolvido] Manter texto fixo em JTextField habilitado

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.

[quote=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.

[/quote]

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

Olá Anderson, é isso mesmo.

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 =]

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

Vai um exemplo a baixo de como usar…

[code]
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);
    	}
    });
}[/code]

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

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.

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

[quote=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. [/quote]

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