Java - Poner un JLabel invisible

 
Vista:

Poner un JLabel invisible

Publicado por Pedro Rodrigues (1 intervención) el 26/03/2022 02:36:52
Buenos dias, tardes o noches, disculpen soy nuevo programando en java y me gustaría saber si alguien me puede explica un problemita que tengo por favor, este es el código del botón de mi JPanel, lo que se tiene que hacer es que desaparezca un label conforme la cantidad de tacos es menor, puse un ciclo for y cada vez que disminuye la cantidad de tacos un label se hace invisible, pero el problema es que se hacen invisibles solo hasta llegar al final del ciclo y no uno por uno :(

String cadena2 = ("Estado: Pedir");
String cadena3 = ("Estado: Comiendo");
int i;

if(EdoPedido.getText() == cadena3){
EdoPedido.setText("Estado: Pedir");
EdoTaquero.setText("Estado: Cocinar");
taco = 10;
Taco10.setVisible(true);
Taco9.setVisible(true);
Taco8.setVisible(true);
Taco7.setVisible(true);
Taco6.setVisible(true);
Taco5.setVisible(true);
Taco4.setVisible(true);
Taco3.setVisible(true);
Taco2.setVisible(true);
Taco1.setVisible(true);


}

else if(EdoPedido.getText() == cadena2){

EdoPedido.setText("Estado: Comiendo");
EdoTaquero.setText("Estado: Esperando");


for(taco = 10; taco >= 0; taco--){
if(taco > 0){
System.out.println("Quedan: " + taco + " tacos");
if(taco == 10){this.Taco10.setVisible(false);}
if(taco == 9){Taco9.setVisible(false);}
if(taco == 8){Taco8.setVisible(false);}
if(taco == 7){Taco7.setVisible(false);}
if(taco == 6){Taco6.setVisible(false);}
if(taco == 5){Taco5.setVisible(false);}
if(taco == 4){Taco4.setVisible(false);}
if(taco == 3){Taco3.setVisible(false);}
if(taco == 2){Taco2.setVisible(false);}
if(taco == 1){Taco1.setVisible(false);}
}
try{
Thread.sleep(500);
} catch(Exception e){}
}

}
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

Poner un JLabel invisible

Publicado por Kabuto (1381 intervenciones) el 26/03/2022 20:47:50
Hola.
Lo que pretendes no es tan sencillo, por la forma en que trabaja Swing de manera interna.
Todo la interfaz, el repintado de ventanas y sus eventos se ejecutan en un hilo especial llamado Event Dispatch Thread que si lo paralizamos o lo ocupamos con determinadas tareas, haremos que la interfaz no responda hasta que esa tarea finalice.

Por eso tus tacos no desaparecen de uno en uno, sino que lo hacen de golpe todos a la vez cuando la tarea ha finalizado.

Sin embargo, podemos abrir un hilo (clase Thread) por separado para que se ocupe de ese tipo de tareas y así no bloquear el EDT.
Incluso a partir de Java 6, se incluyó la clase SwingWorker más específica para ejecutar tareas paralelas al hilo de Swing.

Te dejo aquí un ejemplo sencillo, con una clase SwingWorker reducida a lo más básico.
Fíjate que para ahorrar código, los JLabel con los "tacos" los he juntado en un arreglo. Así el bucle no tiene que andar preguntando para saber cuál taco ha de ser eliminado, directamente los recorre con el índice y los invisibiliza uno a uno.
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
public class Tacos extends JFrame {
 
	private ImageIcon taco = new ImageIcon(getClass().getClassLoader().getResource("desaparecerTacos/taco.png"));
	private JLabel[] lbTacos = new JLabel[10];
	private JButton btDesaparecer = new JButton("Desaparecer Tacos");
 
	public Tacos() {
 
		JPanel pnTacos = new JPanel();
		pnTacos.setLayout(new GridLayout(2,5,5,5));
		for (int i = 0; i < lbTacos.length; i++) {
			//Creamos los tacos y los añadimos al layout de este panel
			lbTacos[i] = new JLabel(taco);
			pnTacos.add(lbTacos[i]);
		}
 
		JPanel pnBoton = new JPanel();
		btDesaparecer.addActionListener(new AccionDesaparecer());
		pnBoton.add(btDesaparecer);
 
		setLayout(new BorderLayout());
		add(pnBoton, BorderLayout.NORTH);
		add(pnTacos, BorderLayout.CENTER);
 
 
		setTitle("Tacos");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
		setLocationRelativeTo(null);
		setVisible(true);
	}
 
	private class TacosWorker extends SwingWorker {
 
		@Override
		protected Object doInBackground() throws Exception {
			//Con un bucle recorremos arreglo de "tacos" y vamos invisibilizando
			for (int i = 0; i < lbTacos.length; i++) {
				lbTacos[i].setVisible(false);
				Thread.sleep(500);
			}
			return null;
		}
 
	}
 
	private class AccionDesaparecer implements ActionListener {
 
		@Override
		public void actionPerformed(ActionEvent e) {
			//Invocamos un nuevo SwingWorker
			TacosWorker fueraTacos = new TacosWorker();
			fueraTacos.execute(); //Ejecutamos
		}
 
	}
 
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				new Tacos();
			}
		});
	}
}

Si lo ejecutamos, veremos que los "tacos" desaparecen uno a uno. Creo que esto es lo que querías conseguir.
Dejo un video mostrando lo que ocurre en pantalla:

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