Quero que a caixa de mensagem apareça imediatamente após o usuário alterar o valor no campo de texto. Atualmente, preciso pressionar a tecla Enter para que a caixa de mensagem seja exibida. Há algo de errado com o meu código?
textField.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
if (Integer.parseInt(textField.getText())<=0){
JOptionPane.showMessageDialog(null,
"Error: Please enter number bigger than 0", "Error Message",
JOptionPane.ERROR_MESSAGE);
}
}
}
Qualquer ajuda seria apreciada!
java
swing
listener
jtextfield
documentlistener
user236501
fonte
fonte
A resposta usual para isso é "use um
DocumentListener
". No entanto, eu sempre acho essa interface complicada. Sinceramente, a interface está com excesso de engenharia. Ele possui três métodos, para inserção, remoção e substituição de texto, quando ele precisa apenas de um método: substituição. (Uma inserção pode ser vista como uma substituição de nenhum texto por algum texto, e uma remoção pode ser vista como uma substituição de algum texto sem texto.)Normalmente, tudo o que você deseja saber é quando o texto na caixa foi alterado , portanto, um
DocumentListener
implementação possui os três métodos que chamam um método.Portanto, criei o seguinte método utilitário, que permite usar um método mais simples
ChangeListener
do que umDocumentListener
. (Ele usa a sintaxe lambda do Java 8, mas você pode adaptá-lo ao Java antigo, se necessário.)Ao contrário da adição de um ouvinte diretamente ao documento, isso lida com o caso (incomum) de instalar um novo objeto de documento em um componente de texto. Além disso, ele soluciona o problema mencionado na resposta de Jean-Marc Astesana , onde o documento às vezes dispara mais eventos do que o necessário.
De qualquer forma, esse método permite substituir um código irritante que se parece com isso:
Com:
Código liberado para domínio público. Diverta-se!
fonte
abstract class DocumentChangeListener implements DocumentListener
com um método abstrato extrachange(DocumentEvent e)
que você chamará dos três outros métodos. Parece mais óbvio para mim, pois usa mais ou menos a mesma lógica que osabstract *Adapter
ouvintes.changedUpdate
método deve ser chamado explicitamente através de uma chamada dentro de cada uminsertUpdate
eremoveUpdate
, a fim de obter-lhe o trabalho ..Basta criar uma interface que estenda o DocumentListener e implemente todos os métodos do DocumentListener:
e depois:
ou você pode até usar a expressão lambda:
fonte
Esteja ciente de que quando o usuário modificar o campo, o DocumentListener poderá, em algum momento, receber dois eventos. Por exemplo, se o usuário selecionar todo o conteúdo do campo e pressionar uma tecla, você receberá um removeUpdate (todo o conteúdo é removido) e um insertUpdate. No seu caso, não acho que seja um problema, mas, de um modo geral, é. Infelizmente, parece que não há como rastrear o conteúdo do textField sem subclassificar o JTextField. Aqui está o código de uma classe que fornece uma propriedade "text":
fonte
Eu sei que isso se refere a um problema muito antigo, no entanto, também me causou alguns problemas. Como kleopatra respondeu em um comentário acima, resolvi o problema com a
JFormattedTextField
. No entanto, a solução requer um pouco mais de trabalho, mas é mais organizada.O
JFormattedTextField
padrão não aciona uma alteração de propriedade após cada alteração de texto no campo. O construtor padrão deJFormattedTextField
não cria um formatador.No entanto, para fazer o que o OP sugeriu, você precisa usar um formatador que chamará o
commitEdit()
método após cada edição válida do campo. ocommitEdit()
método é o que aciona a alteração de propriedade do que eu posso ver e, sem o formatador, isso é acionado por padrão em uma alteração de foco ou quando a tecla Enter é pressionada.Consulte http://docs.oracle.com/javase/tutorial/uiswing/components/formattedtextfield.html#value para obter mais detalhes.
Crie um
DefaultFormatter
objeto formatador ( ) padrão a ser passado para oJFormattedTextField
método através do construtor ou do método setter. Um método do formatador padrão ésetCommitsOnValidEdit(boolean commit)
, que define o formatador para acionar ocommitEdit()
método toda vez que o texto é alterado. Isso pode ser obtido usando aePropertyChangeListener
opropertyChange()
métodofonte
Mas eu não analisaria apenas qualquer coisa que o usuário (talvez por acidente) toque em seu teclado em um
Integer
. Você deve pegar qualquerException
s jogado e verifique se eleJTextField
não está vazio.fonte
Se usarmos o método runnable SwingUtilities.invokeLater () enquanto estiver usando o aplicativo ouvinte de documentos, às vezes, ele fica travado e leva tempo para atualizar o resultado (conforme meu experimento). Em vez disso, também podemos usar o evento KeyReleased para o ouvinte de alteração de campo de texto, conforme mencionado aqui .
fonte
era a versão de atualização do Codemwnci. seu código é muito bom e funciona muito bem, exceto a mensagem de erro. Para evitar erros, você deve alterar a instrução de condição.
fonte
Você pode usar até "MouseExited" para controlar. exemplo:
fonte
Sou novato no WindowBuilder e, de fato, estou voltando ao Java depois de alguns anos, mas implementei "alguma coisa", depois pensei em procurar e encontrar esse segmento.
Estou no meio de testar isso, então, com base em ser novo em tudo isso, tenho certeza de que devo estar perdendo alguma coisa.
Aqui está o que eu fiz, onde "runTxt" é uma caixa de texto e "runName" é um membro de dados da classe:
Parece muito mais simples do que o que está aqui até agora e parece estar funcionando, mas, como estou escrevendo isso, gostaria de ouvir qualquer dica negligenciada. É um problema que o usuário pode entrar e sair da caixa de texto sem fazer alterações? Acho que tudo que você fez é uma tarefa desnecessária.
fonte
Use um KeyListener (que aciona qualquer tecla) em vez do ActionListener (que aciona ao entrar)
fonte
field.getText()
retorna o valor inicial. e o evento (arg0.getKeyChar()
) retorna a verificação de erro pressionada pela tecla para determinar se você deve concatenar com o texto do campo.DocumentFilter ? Dá-lhe a capacidade de manipular.
[ http://www.java2s.com/Tutorial/Java/0240__Swing/FormatJTextFieldstexttouppercase.htm ]
Desculpe. Estou usando Jython (Python em Java) - mas fácil de entender
fonte