Netbeans - Ayuda con delay al pulsar un botón

 
Vista:

Ayuda con delay al pulsar un botón

Publicado por Aldo Adrian (1 intervención) el 18/03/2021 01:02:31
Hola, este es mi primer post en el foro y quisiera saber si me ayudan a resolver mi problema, verán estoy haciendo una aplicación para practicar algunas cosas que he aprendido con el tiempo, pero explicare mi objetivo lo que hago es que leo información atraves de un bloc de notas y lo muestro en un JTextarea con un botón esta parte funciona bien ahora lo que quiero hacer con un segundo botón es que tome reglón por reglón y lo muestre en un jtextfield, es decir tome el renglón 0 lo muestre por un determinado tiempo pongamos 1000 mSeg de ejemplo luego tome el siguiente renglón haciendo lo mismo hasta el ultimo elemento, el detalle es que yo use Thread.sleep pero al ejecutar el segundo boton se queda congelado no puedo hacer nada pero algo hace y cuando acaba solo puedo visualizar el ultimo elemento de los datos, anexo mi codigo para que puedan ver.

1
2
3
4
5
6
7
8
9
10
11
12
String Texto = TxArea.getText();
//Texto = Texto.trim(); //Con esto elimino espacion en blanco del renglon
String[] array = Texto.split("\n");
j = array.length;
for (i = 0; i < j; i++) {
    labelTag.setText(array[i]);
    try {
        Thread.sleep(1000);
    } catch (InterruptedException ex) {
        Logger.getLogger(Interfaz.class.getName()).log(Level.SEVERE, null, ex);
    }
}
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: 12
Ha aumentado su posición en 13 puestos en Netbeans (en relación al último mes)
Gráfica de Netbeans

Ayuda con delay al pulsar un botón

Publicado por Kabuto (17 intervenciones) el 21/03/2021 14:40:23
Hola, una forma de conseguirlo sería creando un Thread.
Un thread es un hilo que se ejecuta de forma paralela al hilo principal del programa y donde tendremos menos problemas para usar pedirle que "duerma" intervalos de tiempo con sleep().

Mira he escrito un ejemplo muy rápido, un marco con dos áreas de texto y un botón.
Permite escribir en un área de texto y al pulsar el botón, se transfieren las líneas al otro área de texto, con un segundo de retraso.

Para hacerlo he escrito una subclase que hereda de Thread, y sobreescribo su método run(). Es aquí donde se ejecutarán las acciones que queremos que ocurran en el hilo paralelo.
Y Es precisamente recuperar las líneas del area texto ( o de un archivo en tu caso) y con un bucle transferirlas al otro area de texto con un delay.
La duración del delay se la paso como argumento en el constructor.
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
private class TransferirConDelay extends Thread {
 
    private long tiempo;
 
    public TransferirConDelay(long tiempo) {
        this.tiempo = tiempo;
    }
 
    @Override
    public void run() {
 
        area2.setText(null);
        transferir.setText("Transfiriendo...");
        transferir.setEnabled(false);
        String[] lineas = area1.getText().split("\n");
        int n = 0;
 
        while (n < lineas.length) {
            area2.append(lineas[n] + "\n");
            try {
                Thread.sleep(tiempo);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            n++;
        }
 
        transferir.setText("Transferir");
        transferir.setEnabled(true);
    }
 
}

Para ejecutar este hilo, lo llamo desde el ActionListener que le asignaré al botón. Simplemente creo un objeto de esta clase Thread y le pido que comience llamando a su método start().
No llamamos al método run() directamente, no funcionará bien si lo hacemos así. Hay que llamar a start(), que el ya sabe como ha de lanzar a run() de forma correcta.

1
2
3
4
5
6
7
private class AccionTransferir implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        TransferirConDelay transfer = new TransferirConDelay(1000);
        transfer.start();
    }
}

Y ya está, eso es todo. Te dejo abajo el código completo. Pruébalo y aplica la misma idea a tu programa.
Ya nos constarás como te ha ido. Un saludo.

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
73
74
75
76
77
78
79
public class TextoDelay extends JFrame{
 
	private JTextArea area1;
	private JTextArea area2;
	private JButton transferir;
 
	public TextoDelay() {
 
		area1 = new JTextArea(20, 28);
		area2 = new JTextArea(20, 28);
		area2.setEditable(false);
		transferir = new JButton("Transferir Texto");
		transferir.addActionListener(new AccionTransferir());
 
		JPanel pnPrincipal = new JPanel();
		pnPrincipal.add(area1);
		pnPrincipal.add(transferir);
		pnPrincipal.add(area2);
		pnPrincipal.setBorder(new EmptyBorder(25,25,25,25));
		setContentPane(pnPrincipal);
 
		setTitle("Texto Delay");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
		setLocationRelativeTo(null);
		setVisible(true);
	}
 
	private class TransferirConDelay extends Thread {
 
		private long tiempo;
 
		public TransferirConDelay(long tiempo) {
			this.tiempo = tiempo;
		}
 
		@Override
		public void run() {
 
			area2.setText(null);
			transferir.setText("Transfiriendo...");
			transferir.setEnabled(false);
			String[] lineas = area1.getText().split("\n");
			int n = 0;
 
			while (n < lineas.length) {
				area2.append(lineas[n] + "\n");
				try {
					Thread.sleep(tiempo);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				n++;
			}
 
			transferir.setText("Transferir");
			transferir.setEnabled(true);
		}
 
	}
 
	private class AccionTransferir implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			TransferirConDelay transfer = new TransferirConDelay(1000);
			transfer.start();
		}
	}
 
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				new TextoDelay();
			}
		});
	}
 
}
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