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