Java - Problema con timer.

 
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

Problema con timer.

Publicado por jose (73 intervenciones) el 21/01/2022 19:17:32
Hola,

A ver si alguien me puede informar. Estoy haciendo un programa con un timer y necesito que se pare cuando pulse un botón o cuando cambié un combobox.

Lo he intentado de varias formas y no hay manera. El tema es que en este ActionListener, timer.cancel(); sólo hace caso cuando el timer llega a 0, pero no cuando pulso otro botón. Para parar.

Adjunto el archivo por si alguien me lo puede aclarar. También me gustaría que si cambio el JCombobox también se detuviese el timer, no sé cómo hacerlo.

La otra es que si le doy al botón "Detener " que contiene lo siguiente
1
2
timer.cancel();
time.setText("Fin");

el JLabel time si cambia. pero el timer sigue corriendo.


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
private class actuarTimer implements ActionListener {
 
 
 
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				PAFText = PAF.getText();
				Timer timer = new Timer();
				time.setForeground(new Color(114, 183, 102));
				if (e.getSource().equals(empezar)) {
 
					timer.scheduleAtFixedRate(new TimerTask() {
 
						int i = Integer.parseInt(time.getText());
 
						public void run() {
 
							String minutesStr = String.valueOf(i);
							time.setText(minutesStr);
							i--;
 
							if(i<=5) {
								time.setForeground(Color.RED);
							}
 
							if (i < 0 ) {
								timer.cancel();
								time.setText("Fin");
							}
						}
					}, 0, 1000);
 
				} else {
					time.setText("Fin");
					timer.cancel();
					//System.exit(0);
 
 
				}
			}
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

Problema con timer.

Publicado por Kabuto (1381 intervenciones) el 21/01/2022 20:07:40
Funcionará mejor si declaras el Timer como atributo de ámbito global, y no dentro del ActionListener
1
2
3
4
5
6
7
8
9
10
11
12
Font font;
		JPanel superior,central, inferior;
		JLabel tituloPAF,PAF,tituloTime,time, horaInicio;
		JComboBox combo;
		JButton empezar, detener;
		private String PAFText;
		private int minutos;
		Timer timer;
 
	}
 
}

En la acción de los botones, solo lo inicializamos cuando se pulse el botón "Empezar".
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
private class actuarTimer implements ActionListener {
 
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				PAFText = PAF.getText();
				time.setForeground(new Color(114, 183, 102));
				if (e.getSource().equals(empezar)) {
 
					timer = new Timer();
					timer.scheduleAtFixedRate(new TimerTask() {
 
						int i = Integer.parseInt(time.getText());
 
						public void run() {
 
							String minutesStr = String.valueOf(i);
							time.setText(minutesStr);
							i--;
 
							if(i<=5) {
								time.setForeground(Color.RED);
							}
 
							if (i < 0 ) {
								timer.cancel();
								time.setText("Fin");
							}
						}
					}, 0, 1000);
 
				} else {
					timer.cancel();
					time.setText("Fin");
				}
			}
		}

Y ahora, como el Timer es de ámbito global y es accesible desde cualquier parte de la clase principal, la acción del combobox ya puede interactuar con él.
Así que puede cancelar, pero previamente comprobando que el Timer ha sido inicializado.
Si intenta cancelar cuando el Timer no ha sido inicialiado todavía (tiene valor null) se produciría una excepción
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
combo.addActionListener(new ActionListener() {
 
				@Override
				public void actionPerformed(ActionEvent arg0) {
 
					//Solo actuamos en el timer si está inicializado
					if (timer != null)
						timer.cancel();
 
					for (int i=0; i<examenes.length;i++) {
 
						if(combo.getSelectedItem().equals(examenes[i][0])) {
							PAF.setText(examenes[i][0]);
							time.setText(examenes[i][1]);
						}
					}
				}
			});

Con esos cambios, parece funcionar como pides.
Adjunto mi archivo modificado
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

Problema con timer.

Publicado por jose (73 intervenciones) el 21/01/2022 20:48:37
Muchas gracias Kabuto,

Como siempre eres el mejor.

Llevaba todo el día buscando el problema. No había caído en el actionPerformed del JComboBox.
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