Quiero que el cuadro de mensaje aparezca inmediatamente después de que el usuario cambie el valor en el campo de texto. Actualmente, necesito presionar la tecla Intro para que aparezca el cuadro de mensaje. ¿Hay algún problema con mi 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);
}
}
}
¡Cualquier ayuda sería apreciada!
java
swing
listener
jtextfield
documentlistener
user236501
fuente
fuente
La respuesta habitual a esto es "usar a
DocumentListener
". Sin embargo, siempre encuentro esa interfaz engorrosa. A decir verdad, la interfaz está sobredimensionada. Tiene tres métodos, para inserción, eliminación y reemplazo de texto, cuando solo necesita un método: reemplazo. (Una inserción se puede ver como un reemplazo de ningún texto con algún texto, y una eliminación se puede ver como un reemplazo de un texto sin texto).Por lo general, todo lo que desea saber es cuándo ha cambiado el texto en el cuadro , por lo que una
DocumentListener
implementación típica tiene los tres métodos que llaman a un método.Por lo tanto, hice el siguiente método de utilidad, que le permite usar un método
ChangeListener
más simple en lugar de aDocumentListener
. (Utiliza la sintaxis lambda de Java 8, pero puede adaptarla para Java antiguo si es necesario).A diferencia de agregar un agente de escucha directamente al documento, esto maneja el caso (poco común) de que instale un nuevo objeto de documento en un componente de texto. Además, resuelve el problema mencionado en la respuesta de Jean-Marc Astesana , donde el documento a veces dispara más eventos de los que necesita.
De todos modos, este método le permite reemplazar el código molesto que se ve así:
Con:
Código liberado al dominio público. ¡Que te diviertas!
fuente
abstract class DocumentChangeListener implements DocumentListener
método abstracto adicional alchange(DocumentEvent e)
que llame desde los otros 3 métodos. Me parece más obvio ya que usa más o menos la misma lógica que losabstract *Adapter
oyentes.changedUpdate
método se invocará explícitamente a través de una llamada dentro de cada uno de ,insertUpdate
yremoveUpdate
para que funcione ..Simplemente cree una interfaz que extienda DocumentListener e implemente todos los métodos DocumentListener:
y entonces:
o incluso puedes usar la expresión lambda:
fuente
Tenga en cuenta que cuando el usuario modifica el campo, DocumentListener puede, en algún momento, recibir dos eventos. Por ejemplo, si el usuario selecciona todo el contenido del campo, luego presiona una tecla, recibirá un removeUpdate (todo el contenido es eliminar) y un insertUpdate. En su caso, no creo que sea un problema pero, en general, lo es. Desafortunadamente, parece que no hay forma de rastrear el contenido de textField sin subclasificar JTextField. Aquí está el código de una clase que proporciona una propiedad "text":
fuente
Sé que esto se relaciona con un problema realmente antiguo, sin embargo, también me causó algunos problemas. Como kleopatra respondió en un comentario anterior, resolví el problema con un
JFormattedTextField
. Sin embargo, la solución requiere un poco más de trabajo, pero es más ordenada.El
JFormattedTextField
no lo hace por defecto de disparo de un cambio de propiedad después de cada texto cambia en el campo. El constructor predeterminado deJFormattedTextField
no crea un formateador.Sin embargo, para hacer lo que sugirió el OP, debe usar un formateador que invoque el
commitEdit()
método después de cada edición válida del campo. loscommitEdit()
método es lo que activa el cambio de propiedad de lo que puedo ver y sin el formateador, esto se activa de forma predeterminada en un cambio de foco o cuando se presiona la tecla Intro.Consulte http://docs.oracle.com/javase/tutorial/uiswing/components/formattedtextfield.html#value para obtener más detalles.
Cree un
DefaultFormatter
objeto formateador ( ) predeterminado para pasarlo aJFormattedTextField
través de su constructor o un método de establecimiento. Un método del formateador predeterminado essetCommitsOnValidEdit(boolean commit)
, que establece el formateador para activar elcommitEdit()
método cada vez que se cambia el texto. Esto se puede recoger utilizando ayPropertyChangeListener
elpropertyChange()
método.fuente
Pero no solo analizaría cualquier cosa que el usuario (tal vez por accidente) toque en su teclado en un
Integer
. Debes atrapar cualquierException
cosa arrojada y asegurarte de queJTextField
no esté vacía.fuente
Si usamos el método ejecutable SwingUtilities.invokeLater () mientras usamos la aplicación de escucha de documentos, a veces se atasca y toma tiempo actualizar el resultado (según mi experimento). En lugar de eso, también podemos usar el evento KeyReleased para escuchar el cambio de campo de texto como se menciona aquí .
fuente
Era la versión actualizada de Codemwnci. su código está bastante bien y funciona muy bien, excepto el mensaje de error. Para evitar errores, debe cambiar la declaración de condición.
fuente
Puede usar incluso "MouseExited" para controlar. ejemplo:
fuente
Soy nuevo en WindowBuilder y, de hecho, acabo de volver a Java después de unos años, pero implementé "algo", luego pensé en buscarlo y me encontré con este hilo.
Estoy a punto de probar esto, así que, dado que soy nuevo en todo esto, estoy seguro de que me falta algo.
Esto es lo que hice, donde "runTxt" es un cuadro de texto y "runName" es un miembro de datos de la clase:
Parece mucho más simple que lo que hay aquí hasta ahora, y parece estar funcionando, pero, dado que estoy escribiendo esto, agradecería saber de cualquier error que se haya pasado por alto. ¿Es un problema que el usuario pueda ingresar y salir del cuadro de texto sin hacer un cambio? Creo que todo lo que has hecho es una tarea innecesaria.
fuente
Use un KeyListener (que se activa en cualquier tecla) en lugar del ActionListener (que se activa al ingresar)
fuente
field.getText()
devuelve el valor inicial. y el evento (arg0.getKeyChar()
) devuelve la tecla presionada, la comprobación de errores es necesaria para determinar si debe concatenar con el texto del campo.DocumentFilter ? Te da la capacidad de manipular.
[ http://www.java2s.com/Tutorial/Java/0240__Swing/FormatJTextFieldstexttouppercase.htm ]
Lo siento. Estoy usando Jython (Python en Java), pero fácil de entender
fuente