Java - problemas con JLabel(no se muestra en frame)

 
Vista:
Imágen de perfil de julio
Val: 7
Ha aumentado su posición en 5 puestos en Java (en relación al último mes)
Gráfica de Java

problemas con JLabel(no se muestra en frame)

Publicado por julio (5 intervenciones) el 18/08/2019 21:12:55
buenas estoy practicando con la libreria swing con Jlabel, pero no me aparece la label ya use el metodo setVisible y no quiere mostrarse voy a dejar el codigo si alguien sabe porque no quiere

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
package grafico1;
import java.util.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JButton;
public class Grafico1 extends JFrame{
   public Grafico1(){
setBounds(+600,+200,500,350);
setTitle("mr operaciones");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
initComponents();
 }
private void initComponents(){
JButton aceptar;
JPanel panel = new JPanel();
setLayout(null);
this.getContentPane().add(panel);
initJlabel();
}
public void initJlabel(){
JLabel saludo;
saludo = new JLabel("nombre");
saludo.setLocation(+600,+200);
initareatext();
}
private static void initareatext(){
initButtons();
}
private static void initButtons(){
}
public static void main(String[] args) {
Grafico1 v = new Grafico1();
}
}
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
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

problemas con JLabel(no se muestra en frame)

Publicado por Kabuto (1381 intervenciones) el 18/08/2019 22:12:13
AL JFrame añades un JPanel.
Pero al JPanel no le estás añadiendo el JLabel, por eso no lo ves. No es suficiente con el setLocation().

Por otro lado, tal y como has escrito el código, no vas a poder añadir el JLabel al JPanel de ningún modo, ya que los declaras en distintos métodos y por lo tanto no hay "visibilidad" entre ellos.
A parte de que es un poco raro que el metodo que va a iniciar el JLabel, llame al método que iniciaría un JTextArea, que a su ve llamaría al método que iniciaría unos JButtons....
Es una metodología extraña y diría que poco aconsejable.

Si no quieres tener problemas de "visibilidad", es decir, que el JPanel y el JLabel puedan "verse" y así añadirse el uno al otro:

O los declaras todos dentro del constructor....
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Grafico1 extends JFrame{
 
	public Grafico1() {
		JPanel panel = new JPanel();
		JLabel saludo = new JLabel("nombre");
		panel.add(saludo);
		getContentPane().add(panel);
 
		setTitle("mr operaciones");
		setSize(500, 350);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		setVisible(true);
	}
 
	public static void main(String[] args) {
		new Grafico1();
	}
 
}

O los declaras en el mismo método...

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
public class Grafico1 extends JFrame{
 
	public Grafico1() {
 
		initComponents();
 
		setTitle("mr operaciones");
		setSize(500, 350);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		setVisible(true);
	}
 
	private void initComponents() {
		JPanel panel = new JPanel();
		JLabel saludo = new JLabel("nombre");
		panel.add(saludo);
		getContentPane().add(panel);
	}
 
	public static void main(String[] args) {
		new Grafico1();
	}
 
}

O los declaras como atributos de clase, siendo así visibles en cualquier parte del programa...
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
public class Grafico1 extends JFrame{
 
	private JLabel saludo;
	private JPanel panel;
 
	public Grafico1() {
 
		iniciarPanel();
		iniciarEtiqueta();
 
		setTitle("mr operaciones");
		setSize(500, 350);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		setVisible(true);
	}
 
	private void iniciarPanel() {
		panel = new JPanel();
		getContentPane().add(panel);
	}
 
	private void iniciarEtiqueta() {
		saludo = new JLabel("nombre");
		panel.add(saludo); //panel y saludo se ven porque son atributos de clase
	}
 
	public static void main(String[] args) {
		new Grafico1();
	}
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 69
Ha disminuido su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

problemas con JLabel(no se muestra en frame)

Publicado por Jonay Zevenzui (23 intervenciones) el 19/08/2019 08:53:09
Kabuto, igual me equivoco y aunque es verdad que es un poco extraña la forma de añadir los componentes, no crees que el principal problema de que no sea visible está en las líneas 12 y 13 de su código, ya que primero hace visible el Jframe, y luego añade los componentes, invirtiendo el orden de estas dos líneas debería de hacerse visible todo?, corrígeme si me equivoco. Un saludo
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 Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

problemas con JLabel(no se muestra en frame)

Publicado por Kabuto (1381 intervenciones) el 19/08/2019 10:59:13
Es cierto que lo ideal es que la instrucción setVisible(true) sea la última en ejecutarse, cuando ya todos los componentes de la interfaz estén inicializados y maquetados.

Pero en este caso, no es ese el problema, y además cuando un JFrame ya es visible, se puede seguir añadiendo/retirando componentes de la interfaz, aunque puede ser algo arriesgado.


Aquí el problema es que en ningún momento está añadiendo el JLabel al JPanel.
Sin esta instrucción:
1
panel.add(saludo);
El JLabel llamado "saludo" nunca se mostrará porque no ha sido agregado (add()) a ningún contenedor de la interfaz, ya sea al JPanel o directamente al JFrame, que también se podría.


Pero es que además, puesto que el JPanel se declara en un método, y el JLabel en otro distinto, no hay "visibilidad" entre ellos.
Están fuera de alcance (scope), por lo tanto si le decimos al panel que añada el JLabel llamado "saludo", el compilador automáticamente nos lanzará un warning indicando que no sabe que es "saludo", a pesar de que están en el mismo código (pero distinto ámbito).

Por ejemplo, si retomamos este código:

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
public class Grafico1 extends JFrame{
 
	public Grafico1() {
 
		initComponents();
 
		setTitle("mr operaciones");
		setSize(500, 350);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		setVisible(true);
	}
 
	private void initComponents() {
		JPanel panel = new JPanel();
		JLabel saludo = new JLabel("nombre");
		panel.add(saludo); //panel y saludo están dentro del mismo ámbito/scope, son visibles entre ellos
		getContentPane().add(panel);
	}
 
	public static void main(String[] args) {
		new Grafico1();
	}
 
}

Ese código compila y funciona bien. "panel" y "saludo" están declarados en el mismo método y por tanto, están dentro del mismo ámbito.

Pero si lo cambiamos de modo que el JLabel lo declaramos en un método separado:
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
public class Grafico1 extends JFrame{
 
	public Grafico1() {
 
		initPanel();
		initLabel();
 
		setTitle("mr operaciones");
		setSize(500, 350);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		setVisible(true);
	}
 
	private void initPanel() {
		JPanel panel = new JPanel();
		getContentPane().add(panel);
	}
 
	private void initLabel() {
		JLabel saludo = new JLabel("nombre");
		panel.add(saludo); //El método initLabel, no puede ver a panel, está fuera de su alcance
	}
 
	public static void main(String[] args) {
		new Grafico1();
	}
 
}
Esto ya produce un warning en la línea donde he puesto el comentario explicando.
Porque el método initLabel() no tiene alcance para ver a "panel". Están en distintos ámbitos y no son visibles.
error1


Si pruebo a cambiar el orden de los métodos e intento que sea el método initPanel() quien añada el JLabel al panel:
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
public class Grafico1 extends JFrame{
 
	public Grafico1() {
 
		initLabel();
		initPanel();
 
		setTitle("mr operaciones");
		setSize(500, 350);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		setVisible(true);
	}
 
	private void initLabel() {
		JLabel saludo = new JLabel("nombre");
	}
 
	private void initPanel() {
		JPanel panel = new JPanel();
		panel.add(saludo);  //Ahora el problema es que initPanel no puede ver a "saludo"
		getContentPane().add(panel);
	}
 
	public static void main(String[] args) {
		new Grafico1();
	}
 
}

Me encuentro con un problema similar. initPanel() no puede ver al JLabel "saludo", es incapaz de resolver a que variable estamos haciendo referencia:

error2


Por esto, es necesario comprender bien que es el ámbito/alcance/scope (tiene varios nombres pero todo refiere a lo mismo) de un programa.

Si queremos que dos elementos sean visibles entre ellos y puedan interactuar, o los declaramos dentro del mismo método, ya sea un constructor, una función o lo que sea...

U otra opción, es declararlos como atributos de clase (hay quien lo llama variables globales) porque así son visibles en TODOS los distintos ámbitos que pueda tener el programa.

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
public class Grafico1 extends JFrame{
 
	/*
	 * Al declararlos como atributos de clase, 
	 * tienen visibilidad total dentro del programa
	 * y cualquier método/función puede acceder a ellos
	 * sin problemas. 
	 */
	private JPanel panel;
	private JLabel saludo;
 
	public Grafico1() {
 
		initLabel();
		initPanel();
 
		setTitle("mr operaciones");
		setSize(500, 350);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		setVisible(true);
	}
 
	private void initLabel() {
		saludo = new JLabel("nombre");
	}
 
	private void initPanel() {
		panel = new JPanel();
		panel.add(saludo);
		getContentPane().add(panel);
	}
 
	public static void main(String[] args) {
		new Grafico1();
	}
 
}

Elegir entre hacerlo de una forma u otra ya depende de nosotros y de cada caso.
Por mi parte, si un componente es poco "importante" y/o una vez puesto en pantalla no va a ser alterado ni va a recibir ninguna interacción, entonces los declaro en el método donde se vaya a maquetar y ya está.
Por ejemplo un JLabel que simplemente muestra un texto tipo "Introduzca su e-mail: ".
Esto no va a ser alterado ni nadie va a interactuar con él, solo necesito que se maquete y ya está. No es importante.


Pero si es un componente más importante, y que varios métodos van a querer interactuar con él, entonces si que los declaro como atributo de clase.
Por ejemplo el JTextField donde el usuario nos proporciona el e-mail.
Habrá un método que quiera recoger ese dato cuando el usuario se registra,
otro método querrá escribir en ese campo cuando el usuario quiera editar sus datos ya registrados,
otro método querrá borrarlo cuando el formulario se resetee,
quizás habrá otro método que quiera comprobar con una expresión regular que se ha escrito una dirección email bien formateada y si no es así, pues quizás cambié el color del campo de texto a color rojo para que el usuario sepa que ese dato no nos vale.

Este si es un elemento importante y que puede requerir ser visible para distintos métodos, así que mejor declararlo como atributo de clase.


Creo que con estos ejemplos ya queda claro qué es el ámbito de un programa y cómo nos afecta.

Si no, por la red hay montones de explicaciones
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 julio
Val: 7
Ha aumentado su posición en 5 puestos en Java (en relación al último mes)
Gráfica de Java

problemas con JLabel(no se muestra en frame)

Publicado por julio (5 intervenciones) el 19/08/2019 18:18:03
gracias por la ayuda entendí el error que cometí como apenas estoy empezando con lo grafico voy a tratar de no repetirlo
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
sin imagen de perfil
Val: 69
Ha disminuido su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

problemas con JLabel(no se muestra en frame)

Publicado por Jonay Zevenzui (23 intervenciones) el 19/08/2019 19:08:25
Kabuto, tiene usted razón, perdona la verdad mire el código por encima, y lo primero que vi fue lo que te comenté. Y ya me pasó, cuando empezaba, el volverme loco porque no aparecía un componente, y era por haber echo visible el JFrame antes de añadirlo, pero no es el caso
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 Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

problemas con JLabel(no se muestra en frame)

Publicado por Kabuto (1381 intervenciones) el 20/08/2019 00:23:00
1
gracias por la ayuda entendí el error que cometí como apenas estoy empezando con lo grafico voy a tratar de no repetirlo

Para aprender, primero hay que cometer errores. Es una ley cósmica je je...

1
Kabuto, tiene usted razón, perdona la verdad mire el código por encima, y lo primero que vi fue lo que te comenté. Y ya me pasó, cuando empezaba, el volverme loco porque no aparecía un componente, y era por haber echo visible el JFrame antes de añadirlo, pero no es el caso

De todos modos, efectivamente lo correcto es, primero declarar y maquetar componentes y por último hacer visible el JFrame.
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