Newsgroup: it.comp.java
Titolo: Esecuzione eventi con actionPerformed

Temo di non aver capito bene i principi di base dell'actionPerformed ...
Ho un programma che opera con JFrame che ha un'esecuzione piuttosto lunga,
e vorrei con una JLabel trasmettere all'utente l'informazione che il
programma sta macinando e che bisogna pazientare un'attimo.
Quando emetto il Jframe, lo emetto con una JLabel:
JLabel caricamento = new JLabel("Scegliere il registro e premere il tasto
-Seleziona-");
Il JFrame è in ascolto con actionPerformed. Appena si verifica la
pressione del tasto "seleziona" la prima istruzione che viene eseguita è:
caricamento.setText("Caricamento in corso: attendere ...");
Seguono le istruzioni di elaborazione dei dati molto lunghe, poi viene
eseguita l'istruzione:
caricamento.setText("Caricamento effettuato!");
Il mio problema è che non riesco a vedere la frase "Caricamento in corso:
attendere ...", mentre le altre le vedo correttamente.
In pratica il setText della Label posto all'inizio di actionPerformed non
è "sentito" subito dal pannello, e fa tempo ad essere sostituito dal
successivo setText, restando invisibile.
Come posso fare per ovviare a questo inconveniente?
Grazie a chi vorrà rispondermi.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Temo di non aver capito bene i principi di base dell'actionPerformed ...
Il tuo problema č che i componenti non vengono ridisegnati finchč non
esci dall'actionPerformed(). Devi mettere le operazioni di
caricamento, che consumano tempo, in un thread separato.
Ad esempio cosě:
import java.awt.*;
import java.awt.event.*;
public class MassimilianoB extends Frame implements Runnable
{
	Label la;
 
	public static void main(String[] args)
	{
		new MassimilianoB();
	}
 
	public MassimilianoB()
	{
		la=new Label("Premi \"seleziona\" ed attendi...");
		this.add(la,"North");
		Button bu=new Button("seleziona");
		bu.addActionListener(new ActionListener()
			{
				public void
actionPerformed(ActionEvent e)
				{
					MassimilianoB.this.la.setText
						("caricamento in
corso, attendere...");
					new
Thread(MassimilianoB.this).start();
				}
			});
		this.addWindowListener(new WindowAdapter()
			{
				public void windowClosing(WindowEvent
e) 
				{
					dispose();
					System.exit(0);
				}
			});
		this.add(bu,"South");
		this.setSize(640,480);
		this.setVisible(true);
	}
 
	public void run()
	{
		// qui le operazioni "time consuming"...
		// al loro posto ho messo una pausa di 5 secondi
		try
		{
			Thread.sleep(5000L);
		}
		catch(InterruptedException e){}
		la.setText("Caricamento effettuato!");
	}
}

 corso, attendere...");
in che modo MassimilianoB.this fa riferimento alla finestra? Se creo piu' 
istanze di classe MassimilianoB?
Ciao
Matteo

istanze di classe MassimilianoB?
Beh a quello ci pensa il thread awt...
Vai tranquillo, funziona.

 Come posso fare per ovviare a questo inconveniente?
Premesso che creare un Thread separato per una operazione lunga è la cosa da 
fare, poiché actionPerformed viene eseguito dal Thread che "consegna" gli 
eventi ai vari oggetti, e quindi tutta l'interfaccia rimane bloccata finché 
questo non ha finito; credo che sia sufficiente chiamare validate() sulla 
Label provocandone l'immediato aggiornamento.
Ciao
Matteo

Scusate il ritardo!
Ringrazio tutti e due per la disponibiltà e le risposte fornitemi.
Il metodo validate() non funziona purtroppo (sarebbe stato troppo bello!).
Viceversa il metodo run(), sì insomma l'uso del Thread, ha risolto
magnificamente il problema. Ma soprattutto ho imparato qualcosa di nuovo.
Grazie ancora
Massimiliano
