Java - Sobre campo vacio en getText()

 
Vista:
Imágen de perfil de jose
Val: 64
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Sobre campo vacio en getText()

Publicado por jose (73 intervenciones) el 25/11/2021 10:36:41
Buenos días,

Tengo un problema que no me permite seguir un curso correctamente por youtube y que después de revisar el código veo que está todo correcto.

Eclipse no me da error, pero al debugear observo que la varible String email = cuadro1.getText(); está vacia.

No entiendo el motivo, en el video funciona correctamente pero no en mi programa. Expongo el metodo que falla y adjunto el archivo java comprimido. Agradecería que alguien me pudiese decir que falla, por que no encuentro el fallo.

No sé si tiene que ver con el sistema operativo, utilizo Ubuntu. Esto lo digo porque para ver el icono en otro programa con setIconImage(miIcono); he tenido que añadir JFrame.setDefaultLookAndFeelDecorated(true); al main.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
 
String email = cuadro1.getText();
 
boolean comprobacion = false;
 
//Buscar Arrobas y tipos
for (int i=0;i<email.length();i++) {
if ( email.charAt(i)=='@') {
comprobacion = true;
}
 
}
 
if (email.isEmpty()) {
System.out.println("La variable " + email + " está vacia");
}
 
if (comprobacion) {
System.out.println("El correo " + email + " es correcto.");
} else {
System.out.println("El correo " + email + " NO es correcto.");
}
 
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Sobre campo vacio en getText()

Publicado por Tom (1831 intervenciones) el 25/11/2021 11:27:45
Pero ¿ por qué creas los componentes en el método paintComponent ? No hay ninguna lógica en hacerlo así. Tú no sabes cuantas veces se va a ejecutar paintComponent(), así que no sabes cuantos JTextField se van a crear, uno encima (o debajo) de otro.

Te recomendaría que te olvidases de youtube y te leyeras el tutorial de swing:
https://docs.oracle.com/javase/tutorial/uiswing/

Tu código debería ser algo como esto (he intentado dejarlo parecido a lo tuyo, aunque aún hay cosas que pueden chirriar un poco):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import java.awt.Dimension;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
 
/* */
public class FocoEvento extends JFrame {
	/* */
	public static void main(String[] args) {
		//JDialog.setDefaultLookAndFeelDecorated(true);
		//JFrame.setDefaultLookAndFeelDecorated(true);
		// TODO Auto-generated method stub
		new FocoEvento().setVisible(true);
	}
	/* */
	public FocoEvento() {
		super("FOCO");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		add(new LaminaFoco());
		pack();
 
	}
	/* */
	class LaminaFoco extends JPanel implements FocusListener {
		/* */
		public LaminaFoco() {
			super((null));
			setPreferredSize(new Dimension(300, 300));
 
			cuadro1 = new JTextField();
			cuadro2 = new JTextField();
 
			cuadro1.setBounds(120, 10, 150, 20);
			cuadro2.setBounds(120, 50, 150, 20);
			add(cuadro1);
			add(cuadro2);
			cuadro1.addFocusListener(this);
		}
 
		@Override
		public void focusGained(FocusEvent e) {
			// TODO Auto-generated method stub
		}
		@Override
		public void focusLost(FocusEvent e) {
			// TODO Auto-generated method stub
			String email = cuadro1.getText();
			boolean comprobacion = false;
 
			//Buscar Arrobas y tipos
			for(int i = 0; i < email.length(); i++) {
				if(email.charAt(i) == '@') {
					comprobacion = true;
				}
			}
 
			if(email.isEmpty()) {
				System.out.println("La variable " + email + " está vacia");
			}
 
			if(comprobacion) {
				System.out.println("El correo " + email + " es correcto.");
			} else {
				System.out.println("El correo " + email + " NO es correcto.");
			}
		}
 
		JTextField cuadro1, cuadro2;
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de jose
Val: 64
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Sobre campo vacio en getText()

Publicado por jose (73 intervenciones) el 25/11/2021 12:16:38
Hola Tom,

Estoy siguiendo un curso y ese es el código del curso. En el que te explican varias cosas de forma separada, ya te dicen que no es como se debería de hacer. El curso consta de más de 300 videos.

En tu código tendría que entender algunas cosas, como:
super("FOCO");
pack();
super((null));
setPreferredSize(new Dimension(300, 300));

Te agradezco el código y el tiempo.
Sólo quiero saber porque la variable String email = cuadro1.getText(); aparece vacía después de añadir una dato en el campo.

Voy a ver tu código para ver si hay algo que llame al objeto cuadro1 y que esté mal escrito. He probado tu código y me funciona correctamente, pero quiero ceñirme al curso dado que se reutiliza código.

Muchas gracias Tom,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Sobre campo vacio en getText()

Publicado por Tom (1831 intervenciones) el 25/11/2021 12:45:26
Hazte un favor y vuelve a leer el principio de mi respuesta.
Tus otras preguntas ... son cosas que deberías saber (como lo de super()) o que están en el tutorial(pack()).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de jose
Val: 64
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Sobre campo vacio en getText()

Publicado por jose (73 intervenciones) el 25/11/2021 13:09:15
A ver Tom. No quiero malos rollos. Si yo quiero seguir un curso en youtube (bueno o malo) es mi problema. Si hago una pregunta. Busco una respuesta no otra pregunta. Solo estoy haciendo una pregunta. Porque la variable está vacía.

Espero que no te moleste mi respuesta, no es mi intención ser descortés ni crear malos rollos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Sobre campo vacio en getText()

Publicado por Tom (1831 intervenciones) el 25/11/2021 15:04:33
Pero ¿ donde ves mal rollo ? Yo te he dado una explicación, y una solución. Pero tu problema está en tu ignorancia (me refiero a este tema en concreto de java y swing).
Y creo que lo que te expliqué es suficiente: estás creando varios JTextField en "stack" uno encima del otro. El tiempo que dediques a pensar en eso es tiempo ganado porque aprenderás mucho más (aprenderás a razonar -de nuevo hablo de java y swing-).
Es de suponer que deberías ya saber java, lo básico, o saber al menos dónde consultarlo y super() es básico, invoca a algún constructor de la superclase o clase base o clase padre o como lo quieras llamar. Es de 1º de herencia.

https://docs.oracle.com/javase/tutorial/java/IandI/super.html

Otro ejemplo, pack()

https://docs.oracle.com/javase/8/docs/api/java/awt/Window.html#pack--

(En el tutorial de swing te explicará un poco mejor por qué es conveniente usarlo).


Volviendo al problema, para que lo veas más claro, pon esta traza en tu método:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
		public void focusLost(FocusEvent e) {
 
			// TODO Auto-generated method stub
 
			String email = cuadro1.getText();
 
			boolean comprobacion = false;
 
			 // TRAZA:
			System.out.println("FocusLost editing component: " + e.getComponent().hashCode());
			System.out.println("FocusLost cuadro1: " + cuadro1.hashCode());
...
...
                }

Verás que cuando te funciona mal es porque el componente en el que escribes algo (el que pierde o gana el foco) _no_ es el que tienes almacenado en cuadro1.
Por si acaso hashCode() identifica a cada objeto, dos objetos distintos tienen hashCode() distinto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de jose
Val: 64
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Sobre campo vacio en getText()

Publicado por jose (73 intervenciones) el 25/11/2021 16:11:26
Hola Tom,

Ante todo disculpa por el mal entendido.

No soy experto en programación. No me dedico a esto, solo lo hago por curiosear y hacer cosas para mí.

Lo de la herencia lo entiendo. Era sólo el null en super((null));

Con lo que me pones en el código me sale esto:

FocusLost editing component: 503741048
FocusLost cuadro1: 105654268

Entiendo que no son el mismo objeto.

Estoy aún más alucinado es el mismo código que pone el video y le funciona, como todos los comentarios.

Muchas gracias y disculpa de nuevo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Sobre campo vacio en getText()

Publicado por Tom (1831 intervenciones) el 25/11/2021 17:11:19
Sigo pensando que aunque lo hagas por hobby, o lo que sea, tendrías que ir auto-enseñándote.
Lo que te falta por entender ahora es para qué sirve paintComponent().
Mi explicación va a ser tan resumida que será incorrecta, hay que ir a la documentación y los tutoriales:
paintComponent() se usa cuando tu código o swing necesitan "repintar" el contenido de una ventanita (digamos). Fíjate que digo repintar, no recrear o rehacer.

¿ Cuando sucede esto ? Pues generalmente la primera vez que se hace visible una ventana y luego cada vez que se hace visible después de haber estado oculta. De ahí lo de que tú no sabes cuantas veces va a ser invocado tu método paintComponent().

¿ Por qué a él le funciona ? Bueno, a mí también me funciona casi siempre la primera vez.
Porque funcionará cuando solamente se invoque una vez a paintComponent(). En cuanto iconices (¿iconifiques, minimices?) la ventana y la vuelvas a de-iconizar empezará a fallar.
O no, porque puede ser que, por factores externos a java y a swing, (por ejemplo en linux el atributo backingstore de las ventanas de X11) podría ser que no fuese necesario el repintado ya que "alguien" mantiene una foto de tu ventana y la vuelve a poner cuando hace falta.

Estas son las cosas que generalmente no te explican en youtube, pero sí están explicadas en un buen tutorial escrito que, además, suele tener un índice.

Ah!
super(null). No tienes más que mirar los constructores de JPanel (superclase de LaminaFoco) y verás este:

https://docs.oracle.com/javase/7/docs/api/javax/swing/JPanel.html#JPanel(java.awt.LayoutManager)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de jose
Val: 64
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Sobre campo vacio en getText()

Publicado por jose (73 intervenciones) el 25/11/2021 18:00:56
Hola Tom,

La API de Java le he echado vistazos varias veces, pero no sé como utilizarlo. Cuando realicé el curso de programación básica en el ciclo de redes, se dio muy por encima, más bien como información. Ahora estoy interesado en hacer un curso completo de programación de Java.

Muchas gracias por la información.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar