IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Agents de placement/Fenêtres Java Discussion :

Communication entre un Thread et une JFrame


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Communication entre un Thread et une JFrame
    Bonjour tout le monde,

    je n'arrive pas malgrès les tutoriels à rafraichir le JTextArea d'une JFrame depuis mon Thread principale, j'ai compris que ce que je fais ne peut pas marcher mais je ne comprends pas comment je peux faire pour que ca fonctionne

    donc si quelqu'un pourrait m'expliquer ce que je dois faire un peu plus precisement ce serait sympa

    voici le code de l'app qui est censé envoyé les données

    /**
    public class iRc1311
    {
    public static void main(String[] args)
    {
    ...
    StatusWindow statusWindow = new StatusWindow();
    statusWindow.main(null);

    IrcProtocolThread socketTest= new IrcProtocolThread(profile);
    socketTest.start();

    Thread lol = new Thread();
    lol.start();

    //boucle infini
    while(socketTest.isAlive())
    {
    String in1 = socketTest.getIrcInput();
    if(in1 != null)
    {
    //statusWindow.setJTextArea1(in);
    System.out.println(in1);
    }
    String echo = socketTest.getIrcEcho();
    if(echo != null)
    {
    //statusWindow.setJTextArea1(echo);
    System.out.println(echo);
    }
    try
    {
    Thread.sleep(10);
    }
    catch(InterruptedException ex)
    {
    }
    //socketTest.stopIrcProtocolThread();
    }
    }
    }


    et voici celui de la frame

    /*

    public class StatusWindow extends javax.swing.JFrame {

    public StatusWindow() {
    initComponents();

    private void initComponents() {
    jTextField1 = new javax.swing.JTextField();
    jScrollPane1 = new javax.swing.JScrollPane();
    jTextArea1 = new javax.swing.JTextArea();

    ...
    pack();
    }

    private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt)
    setJTextArea1(jTextField1.getText());
    jTextField1.setText(null);
    }

    public void setJTextArea1(String text)
    {
    jTextArea1.append(text + "\n");
    }

    public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
    new StatusWindow().setVisible(true);
    }
    });
    }

    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;
    private javax.swing.JTextField jTextField1;



    }

  2. #2
    Invité
    Invité(e)
    Par défaut
    C'est dans l utilisation du thread que tu te plante :

    - tu doit creer une classe qui herite de Thread (class MaClasse extends Thread)
    - cette classe doit implementer une methode run() (qui contiendra ton code qui raffraichi le jtextarea et fait tes traitement).
    - et tu doit lancer tout ca avec la methode start depuis ton main.
    - Je ne comprend pas pourkoi tu a la methode run dans ton interface .... je sais pas o tu as trouve ce code mais c est vraiment etrange ^^

    Tu doit donc avoir 3 classe :

    - une classe iRc3111 qui va (dans le main) : instancier l afficheur, instancier un ThreadTraitement avec l afficheur en parametre, lancer le thread avec start()
    -une classe ThreadTraitement dont le constructeur mettra en attribut l'afficheur passe en argument, une methode run() qui fera tes traitement et mettra a jour l affichage (via l'attribut)
    -une classe Afficheur qui va creer ta frame dans son constructeur et va declarer toutes les methodes dont aura besoin le thread.

    Bonne chance.

  3. #3
    Membre confirmé Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Points : 465
    Points
    465
    Par défaut
    L'idee essentielle est de declarer les variable externe au Thread mais que l'on veut utiliser avec le modificateur final. ainsi il est possible de ne pas construire une classe Thread etendue en utilisant la methode anonyme de construction de l'interface simple Runnable.
    Citation Envoyé par max0r1311
    Bonjour tout le monde,

    je n'arrive pas malgrès les tutoriels à rafraichir le JTextArea d'une JFrame depuis mon Thread principale, j'ai compris que ce que je fais ne peut pas marcher mais je ne comprends pas comment je peux faire pour que ca fonctionne

    (...)
    /**
    public class iRc1311
    {
    public static void main(String[] args)
    {
    //(...)
    final StatusWindow statusWindow = new StatusWindow();
    statusWindow.main(null);

    final IrcProtocolThread socketTest= new IrcProtocolThread(profile);
    socketTest.start();
    /* ici pour faire plus rapide il faut instancier une Runnable en utilisant statusWindow dans le code run() */
    Thread lol = new Thread(new Runnable() {
    public void run() {
    while(socketTest.isAlive())
    {
    String in1 = socketTest.getIrcInput();
    if(in1 != null)
    {
    statusWindow.setJTextArea1(in);
    System.out.println(in1);
    }
    String echo = socketTest.getIrcEcho();
    if(echo != null)
    {
    statusWindow.setJTextArea1(echo);
    System.out.println(echo);
    }
    try
    {
    Thread.getCurrentTread().sleep(10);
    }
    catch(InterruptedException ex)
    {
    }
    //socketTest.stopIrcProtocolThread();
    }
    }
    });
    //boucle infini
    lol.start();

    }
    }


    et voici celui de la frame

    /*

    public class StatusWindow extends javax.swing.JFrame {

    public StatusWindow() {
    initComponents();

    private void initComponents() {
    jTextField1 = new javax.swing.JTextField();
    jScrollPane1 = new javax.swing.JScrollPane();
    jTextArea1 = new javax.swing.JTextArea();

    ...
    pack();
    }

    private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt)
    setJTextArea1(jTextField1.getText());
    jTextField1.setText(null);
    }

    public void setJTextArea1(String text)
    {
    jTextArea1.append(text + "\n");
    }

    public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
    new StatusWindow().setVisible(true);
    }
    });
    }

    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;
    private javax.swing.JTextField jTextField1;



    }

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    alors j'ai modifié le code comme vous me l'avez dis,

    maintenant il ne rate plus de ligne , il va bien dans la methode void setJTextArea1()

    mais (car il y a toujours un mais) le jTextArea1 ne se rafraichit toujours pas argggg

    donc en gros ca marche super bien dans la console mais quand il passe sur jTextArea.append(text + "\n"); rien ne s'affiche


    sinon concernant la méthode run dans l'interface c'est l'éditeur graphique d'interface netbeans qui me la générer donc je ne sais pas non plus d'ou ca sort

  5. #5
    Membre confirmé Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Points : 465
    Points
    465
    Par défaut
    Ah oui il manque l'appel statusWindow.update(statusWindow.getGraphics())

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    ca n'a toujours aucun effet quand je le rajoute

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Bon en modifiant le code généré par netbeans pour l'interface graphique
    ca fonctionne avec le code original

    mais il y a des données entrantes qui ne sont pas affichés donc je vais revoir la structure de mon programme merci a tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 04/12/2006, 12h21
  2. Réponses: 2
    Dernier message: 23/09/2006, 23h23
  3. Communication entre 2 thread
    Par poxigua dans le forum GTK+
    Réponses: 3
    Dernier message: 08/08/2006, 17h59
  4. Communication entre 2 threads
    Par marsupilami34 dans le forum Langage
    Réponses: 4
    Dernier message: 26/08/2005, 16h08
  5. Communication entre deux Threads
    Par rvzip64 dans le forum Langage
    Réponses: 13
    Dernier message: 28/01/2005, 10h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo