• # Swing

    Posté par . En réponse au message Java et Regexp. Évalué à 1.

    Salut,

    C'est du pinaillage mais dans ton code tu executes des opérations "lentes"
    a l'intérieur du thread Swing.

    Dans Swing, les evenements générés par l'interface
    utilisateur sont reçus par la JVM et stockés dans une file d'evenements. A
    l'intérieur de la JVM, un thread d'expedition d'evenements ( implémenté par la
    class java.awt.EventQueue) surveille cette file et expédie les évenements
    arrivants aux listeners intéressés.

    Le thread Swing s'occupe d'afficher les composants graphiques. Si tu effectues
    des traitements couteux à l'intérieur de ce thread, tu vas empecher la mise
    à jour de l'interface.

    ( Note : la méthode actionPerformed() ici correspond à ta méthode jButton1ActionPerformed() , le listModel est le modele d'une JList et correspond à ton
    composant JTextArea - mais c'est plus explicite avec un listModel )

    1. Exemple de ce qu'il *ne faut pas* faire :
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~


    Ici le thead Swing est bloqué pendant 1 seconde, si tu resize la fenetre par exemple, elle ne serait pas repainte .


    public void actionPerformed(ActionEvent event) {
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    for (int i = 0; i < 100; i++) {
    val++;
    listModel.addElement(new Integer(val));
    }
    }


    2. Exemple de ce qu'il *ne faut pas* faire :
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Ici le travail est bien effectué à l'exterieur du thread Swing, mais le modele de liste n'est pas mis à jour à l'intérieur du thead Swing.

    public void actionPerformed(ActionEvent event) {
    new Thread(new Runnable() {
    public void run() {
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    for (int i = 0; i < 100; i++) {
    val++;
    listModel.addElement(new Integer(val));
    }
    }
    }).start();
    }
    }



    3. La bonne manière de procéder
    ~~~~~~~~~~~~~~~~~~~~~~

    - le travail est effectué à l'extérieur du thread Swing
    - la mise à jour du composant graphique est effectuée à l'intérieur du thread Swing.

    public void actionPerformed(ActionEvent event) {
    new Thread(new Runnable() {
    public void run() {
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    for (int i = 0; i < 100; i++) {
    val++;
    listModel.addElement(new Integer(val));
    }
    }
    });
    }
    }).start();
    }


    Références
    ~~~~~~~

    Le threading dans Swing :
    http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html(...)

    Les exemples de code et plus d'explication :
    http://www.clientjava.com/blog/2004/08/20/1093059428000.html(...)