Newsgroup: it.comp.java
Titolo: Primo programma swing

Visto che è arrivato il fine settimana vi concedo il privilegio di
divertirvi con qualche facile domandina su java... :-))))
A parte gli scherzi, sto scrivendo il mio primo programmino swing, e non
so come fargli fare alcune semplici cose:
1 - Quando premo il JButton "Avvia", nella label dovrebbe apparire "Inizio
processo", invece non appare; quando il processo finisce la label viene
aggiornata, riportando il messaggio "Fine processo". Come faccio a fare
apparire il messaggio intermendio??? Ho provato con f.repaint() ma non
funge, cosa devo fare???
2 - Senza ricorrere alla programmazione multithreading, premendo il tasto
"Stop" mentre il processo avviato da "Avvia", esiste un modo di far
rilevare la pressione in maniera postuma (cioè quando termina il processo)???
Spero di aver fatto domande in modo comprensibile.
Il programma è il seguente:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class spi2{
    private static JLabel label;
    static JFrame f;
    static boolean flag = false;
    public static void main(String argv[]){
        JPanel p = new JPanel();
        label = new JLabel("Trim 0");
        JButton b = new JButton("Avvia");
        b.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                String ppp = "";
                label.setText("Inizio processo");
                f.repaint();
                for(int c = 0 ; c < 6000 ; c++)
                    ppp = ppp + "aaaa";
                label.setText("Fine processo"); 
                if(flag)                   
                    label.setText("Premuto il tasto stop"); 
            }
        });
        JButton c = new JButton("Stop");
        c.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent r){
                flag = true;
            }
        });
        p.add(b);
        p.add(c);
        p.add(label);
 
        f = new JFrame("Spider0.1");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setBounds(50 , 50 , 300 , 200);
        f.getContentPane().add(p);
        f.setVisible(true);
    }
}
Denghiu
Paolo


L'evento viene generato alla pressione, altrimenti che evento č? :) 

:
|| 1 - Quando premo il JButton "Avvia", nella label dovrebbe apparire
|| "Inizio processo", invece non appare; quando il processo finisce la
|| label viene aggiornata, riportando il messaggio "Fine processo".
|| Come faccio a fare apparire il messaggio intermendio??? Ho provato
|| con f.repaint() ma non funge, cosa devo fare???
Cerca SwingWorker sul sito della sun. A me ha risolto molti problemi.
-- 
^I^caro
http://preponderante.splinder.it
  o  
http://icaro.blogspot.com
       "Dove mai andiamo?"......"Sempre a casa"....

 L'evento viene generato alla pressione, altrimenti che evento è? :)
Forse mi sono spiegato un po da cane :-(.
Per esempio, se avvio il ciclo for (con il pulsante "Avvia") e durante la
sua esecuzione premo il tasto X di chiusura della  finestra, subito non
accade nulla, ma appena termina il ciclo il programma si chiude; in
sostanza l'evento è stato "registrato" ed  appena termina la sequenza di
istruzioni va in esecuzione la parte di programma conseguente all'evento
stesso.
In sostanza a me servirebbe sapere se è possibile, ad esempio durante il
ciclo for inserire un'istruzione che dica al programma stesso: "guarda un
po se mentre stavi ravanando io ho schiacciato qualche pulsante".
Mi accorgo che mi spiego in termini veramente elementari, ma sono un
programmatore hobbista senza pretese...
Paolo

 accade nulla, ma appena termina il ciclo il programma si chiude;
[CUT]
Stai mischiando codice d'elaborazione e codice di aggiornamneto della GUI
all'interno dello stesso listener, bloccando dunque il famoso event
dispatching thread.
La giusta sequenza dovrebbe essere: listener del pulsante -> codice
d'elaborazione in un altro thread (in questo modo sblocchi la GUI) -> altro
codice di aggiornamento della GUI in un altro listener o utilizzando
SwingUtilities.invokeLater(...) o SwingWorker.
Questo ti spiega tutto molto bene:
http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html
Saluti,
Sergio B. 
-- 
Sergio Bossa
Author and Developer of:
- Montag, Web Services System for XML Database Interaction:
 
http://montag.sourceforge.net
- QuickNote:
 
http://quicknote.sourceforge.net


Devi cmq spostare su un altro thread l'elaborazione, poi dentro il thread 
controlli lo stato di una variabile (che modifichi quando si genera 
l'evento) ed esci dal ciclo se la variabile č stata modificata