[JAVA] problème avec une classe....

problème avec une classe.... [JAVA] - Programmation

Marsh Posté le 07-03-2002 à 11:05:20    

Voila j'ai une classe qui ressemble en gros a ca, a part qu'il y a plein d'autres choses dedans mais j'ai simplifie pour que ce soit plus rapide a comprendre...
 
Mon problème c'est que j'ai implemente runnable pour faire tourner une methode dans le run() mais quand je lance mon appli, il ne se passe rien alors qu'il devrait me sortir des "coucou"...
 
Alors tout mon probleme est la comment faire marcher cette classe ou qu'est ce qui deconne?
 
 
public class Chatinterface extends JFrame implements Runnable {
     
    public void run() {
    System.out.println("coucou" );
    }
     
    //constructeur
    public Chatinterface() {
//j'ai des trucs la dedans mais peu importe    
}
}

Reply

Marsh Posté le 07-03-2002 à 11:05:20   

Reply

Marsh Posté le 07-03-2002 à 11:24:21    

up :na:

Reply

Marsh Posté le 07-03-2002 à 11:26:21    

ben, une classe Runnable, il faut lui associer une Thread, et la faire démarrer...
 
Le truc le plus simple pour que ça marche comme ça, c'est de faire :
 
public Chatinterface() {  
//j'ai des trucs la dedans mais peu importe    
 
Thread t = new Thread(this);
t.start();
}

Reply

Marsh Posté le 07-03-2002 à 11:30:57    

et je passe mon code comment?

Reply

Marsh Posté le 07-03-2002 à 11:32:14    

En fait, comment je fais tourner ma boucle? dans le run()?

Reply

Marsh Posté le 07-03-2002 à 11:37:23    

bah...........Habituellement, on fait ça : on met un attibut booléen dans la classe runnable, par exemple, alive
 
et dans le run(), tu fais :  
 
run() {
while(alive) {
// ton code
}
}
 
et pour arrêter la thread, il suffit de mettre alive à false.

Reply

Marsh Posté le 07-03-2002 à 11:39:30    

Pas mieux !

Reply

Marsh Posté le 07-03-2002 à 11:44:50    

Un truc en passant. C'est pas trop cool que tu étendes JFrame et que tu implémente Runnable.
 
Ce serait mieux si tu séparais ta frame du process derrière. Genre tu fais ta frame et tu as un attribut Runnable
 
public class ChatInterface extends JFrame {
 
   private Thread myThread= null;
 
   public ChatInterace() {
 
     myThread = new Thread(new MyOtherClass());
 
     ....
 
    }
 
   myThread.start();
 
   ...
 
}


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-03-2002 à 11:47:25    

Bâh pourquoi !
 
Non, sérieux le concept que tu avances m'intéresse mais un peu comme benou, j'aime les arguments.

Reply

Marsh Posté le 07-03-2002 à 11:50:06    

parce que la frame en elle même est un thread meme si c'est transparent pour toi.
 
Et puis parce qu'il faut simplement séprare les concepts de GUI et de process dessus. Une meilleure solution c'est de faire une inner classe avec le thread comme ca il peut accéder aux champs de la classe mère (ie la JFrame)
 
Et puis c'est simplement une question de design. Tu sais tu peux faire des projets de plein de facons. La je bosse sur un truc où le gars utilise tout le temps des BigDecimal alors qu'il pourrait metre un simple int
 
Je ne te dis que ca :(
 
Donc ce n'est pas une interdiction, c'est juste du design


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-03-2002 à 11:50:06   

Reply

Marsh Posté le 07-03-2002 à 11:53:17    

Justement, le design c'est ma grande passion (:D) et tout ce qui touche à la conception correcte d'appli Java me plait. Donc tel le scarabée, j'écoute les préceptes du maître. @+

Reply

Marsh Posté le 07-03-2002 à 11:58:19    

Je m'insère pour essayer de répondre, et voir si j'ai bien compris ce que m'indiqué DarkLord la dernière fois:
 
A l'heure actuelle, le système de modélistion le plus en vogue est le MVC: modèle, vue, contrôleur. Il permet de séparer les données des traitements et de leur représentation. Modélisation plus galère à coder, mais plus propre, et qui suporte plus facilement les évolution.
 
Voili, voila.


---------------
"Si ça peut déconner, ça va déconner..."
Reply

Marsh Posté le 07-03-2002 à 12:00:58    

Deepcore a écrit a écrit :

Voili, voila.  




 
Comme ça tout est clair.

Reply

Marsh Posté le 07-03-2002 à 12:07:58    

et pour votre info, MVC est utilisé dans SWING


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-03-2002 à 12:22:42    

DarkLord a écrit a écrit :

et pour votre info, MVC est utilisé dans SWING  




C'est d'ailleurs pour ça qu'on doit foutre des JScollPane de partout !

Reply

Marsh Posté le 07-03-2002 à 12:36:50    

Ca je m'en doutais un peu que c'etais pas cool mais je fais pas du java depuis très longtemps alors c'est excusable non ?  ;)  
 
Ton code me semble pas mal je vais essayer merci...

DarkLord a écrit a écrit :

Un truc en passant. C'est pas trop cool que tu étendes JFrame et que tu implémente Runnable.
 
Ce serait mieux si tu séparais ta frame du process derrière. Genre tu fais ta frame et tu as un attribut Runnable
 
public class ChatInterface extends JFrame {
 
   private Thread myThread= null;
 
   public ChatInterace() {
 
     myThread = new Thread(new MyOtherClass());
 
     ....
 
    }
 
   myThread.start();
 
   ...
 
}  



Reply

Marsh Posté le 07-03-2002 à 13:25:52    

billyboy78 a écrit a écrit :

Ca je m'en doutais un peu que c'etais pas cool mais je fais pas du java depuis très longtemps alors c'est excusable non ?  ;)  
 
Ton code me semble pas mal je vais essayer merci...
 




 
Vi bien sur ;)
 
pour le code tu peux faire un truc dans ce gout là si tu n'as qu'une seule thread et si elle n'est pas trop "longue"
 

Code :
  1. public class ChatInterface extends JFrame {
  2.     class TrouveUnNom implements Runnable {
  3.        public TrouveUnNom() {
  4.            // bla bla
  5.        }
  6.        public void run() {
  7.            // Ici tu peux accéder aux champs de la classe ChatInterface sans problème
  8.        }
  9.     }
  10.     public ChatInterface() {
  11.         myThread = new Thread(new TrouveUnNom());
  12.             // ... myThread.start();
  13.     }
  14. }

 

[jfdsdjhfuetppo]--Message édité par DarkLord--[/jfdsdjhfuetppo]


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-03-2002 à 13:28:26    

DarkLord a écrit a écrit :

 
 
Vi bien sur ;)
 
pour le code tu peux faire un truc dans ce gout là si tu n'as qu'une seule thread et si elle n'est pas trop "longue"
 

Code :
  1. public class ChatInterface extends JFrame {
  2.     class TrouveUnNom implements Runnable {
  3.        public TrouveUnNom() {
  4.            // bla bla
  5.        }
  6.        public void run() {
  7.            // Ici tu peux accéder aux champs de la classe ChatInterface sans problème
  8.        }
  9.     }
  10.     public ChatInterface() {
  11.         myThread = new Thread(new TrouveUnNom());
  12.             // ... myThread.start();
  13.     }
  14. }

 
 
 




 
 
Merci merci , c cool, je n'en demandais pas tant  :D

Reply

Marsh Posté le 07-03-2002 à 13:58:16    

billyboy78 a écrit a écrit :

 
 
 
Merci merci , c cool, je n'en demandais pas tant  :D  




 
Bin euh de rien. j'ai pas fait grand chose :)


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-03-2002 à 15:30:05    

ah j'ai un autre probleme maintenant, ma boucle tourne comme il faut mais j'ai une methode que j'appele et qui me fais des erreurs alors que si je l'appele en cliquant sur un bouton elle fonctionne...???
 
//la fonction que j'appele
public String readTexte()
    {
    String texte = new String();
    boolean testLecture=false;
    if (this.connecte==1)
    {
     try {
     testLecture=this.in.ready();
     } catch(IOException err)
     { }
 }
    if (testLecture==true)
    {    
    try {
    texte=this.in.readLine();  
    texte=texte + "\n";
    } catch(IOException err)
    { }
 }
 return texte;
    }
   
 
//et le message d'erreur que j'obtient
java.lang.NullPointerException
at Chatserveur.readtexte<Chatserveur.java:45>
at Chatinterface.getMessageTexte<Chatinterface.java:157>
at Chatinterface.access$000<Chatinterface.java:9>
at Chatinterface$Chattimertexte.run<Chatinterface.java:26>
at java.lang.Thread.run<Unknown Source>
 
 
 
voila voila....

Reply

Marsh Posté le 07-03-2002 à 15:31:24    

je mets aussi les 2 classes en entier si ca peut aider...
 
 
import java.net.*;
import java.io.*;
 
public class Chatserveur extends Thread {
 
    private ServerSocket serveur;
    private Socket socketVersClient = null;
    private static int port=5412;
    private static int nbConnexions=10;
    private int erreur=0;
    private int connecte=0;
    private PrintWriter out;
    private BufferedReader in;
    private InputStreamReader socket_in;
     
    public void envoyerTexte(String texte)
     {
     if (this.connecte==1)
     {
         this.out.println(texte);
         this.out.flush();
     }
     }
     
     
    public String readTexte()
    {
    String texte = new String();
    boolean testLecture=false;
    if (this.connecte==1)
    {
     try {
     testLecture=this.in.ready();
     } catch(IOException err)
     { }
 }
    if (testLecture==true)
    {    
    try {
    texte=this.in.readLine();  
    texte=texte + "\n";
    } catch(IOException err)
    { }
 }
 return texte;
    }
     
    public int getErreur()
    {
    return this.erreur;    
    }
     
    public void stopServeur()
    {
if (this.connecte==1)
{
try {  
        this.serveur.close();  
        } catch(IOException err)
        {
    }
}
}
     
    public Chatserveur() {
     try {    
         this.serveur = new ServerSocket(this.port,this.nbConnexions);
         this.socketVersClient = (Socket)null;
         this.start() ;    
             
     } catch(IOException err)
        {
        this.erreur=1;
     }
    if (this.erreur==0)
    {
    this.connecte=1;    
    }
    }
 
    public void run() {  
     
       try {  
        while(true) {
        this.socketVersClient = this.serveur.accept();            
        this.out = new PrintWriter ( socketVersClient.getOutputStream());
   
  this.socket_in = new InputStreamReader( socketVersClient.getInputStream());
  this.in = new BufferedReader ( socket_in);
 
        }
        } catch(IOException err)
        {
        //this.erreur=1;
     }
    }
     
}
 
 
 
 
 
 
 
import javax.swing.*;
import javax.swing.border.*;
import java.awt.event.*;
import java.awt.*;
import java.net.*;
 
public class Chatinterface extends JFrame {
     
    //l'objet Chatserveur
    private Chatserveur connexionServeur;
    //l'objet Chatclient
    private Chatclient connexionClient;
    //le thread qui fait tourner la boucle pour recuperer les messages
    private Thread threadMessage= null;
 
 //la classe runnable qui lit les messages
 //je l'est mise ici pour pouvoir acceder aux methodes de Chatinterface
private class Chattimertexte implements Runnable {
 
 public void run() {  
 while (true)
 {
 //System.out.println("coucou" );
 getMessageTexte();
 }
 }
 
 public Chattimertexte () {
   
 }
 
 }
 
    //tous les elements de l'interface graphique
    private String titreFenetre;
    private JLabel labelInfos;
    private JLabel labelTexteInfos;
    private JTextField fieldMessage;
    private JLabel labelIP;
    private JLabel labelNom;
    private JTextField fieldIP;
    private JTextField fieldNom;
    private JButton buttonConnecter;
    private JButton buttonTest;
    private JTextArea textareaDialogue;
    private JScrollPane scrollDialogue;
     
    //diverses variables...
    //1 si en serveur
    //2 si en client
    private int etat=1;
     
     
    //methode qui lance la boucle de reception des messages
    private void startMessageLoop()
    {
    this.threadMessage = new Thread (new Chattimertexte());  
    this.threadMessage.start();  
    }
     
    //methode qui stoppe la boucle de reception des messages
    private void stopMessageLoop()
    {
    this.threadMessage.stop();  
    }
     
    //methode pour modifier le texte d'information
    private void setTexteInfos(String texte)
    {
    this.labelInfos.setText(texte);    
    }
     
    //change la variable etat du chat
    private void setEtat(int etat)
    {
    this.etat=etat;    
    }
     
    //stoppe la partie serveur du chat
    private void arreterServeur()
    {
     this.connexionServeur.stopServeur();    
    }
     
    //stoppe la partie client du chat
    private void arreterClient()
    {
     this.connexionClient.stopClient();    
    }
     
    //renvoie l'état du chat
    private int getEtat()
    {
    return this.etat;    
    }
     
    //modifie le contenu du bouton connexion/deconnexion
    private void setBoutonConnexion(String texte)
    {
    this.buttonConnecter.setText(texte);    
    }
     
    //methode pour modifier le texte de la barre de titre
    public void setTitreFenetre(String texte)
    {
    setTitle(texte);    
    }
     
    //methode qui envoie le message
    //quand l'utilisateur appuie sur entree
    public void envoyerMessage()
    {
    if(this.fieldMessage.getText()!=null)
    {
        this.textareaDialogue.append(this.fieldNom.getText() + " : " + this.fieldMessage.getText() + "\n" );
        if(this.getEtat()==2)
        {
        this.connexionClient.envoyerTexte(this.fieldNom.getText() + " : " +  this.fieldMessage.getText() + "\n" );
        }
        else
        {
        this.connexionServeur.envoyerTexte(this.fieldNom.getText() + " : " +  this.fieldMessage.getText() + "\n" );    
        }
        this.fieldMessage.setText("" );
    }
    }
     
    //renvoie l'adresse contenu dans le textfield ip
    public String getAdresseIP()
    {
    return this.fieldIP.getText();    
    }
     
    //renvoie le pseudo contenu dans le textfield nom
    public String getNom()
    {
    return this.fieldNom.getText();    
    }
     
    //pour lancer la partie serveur de la connection
    private int creerConnexionServeur()
    {
    this.connexionServeur= new Chatserveur();
    return this.connexionServeur.getErreur();
    }
     
     
    //methode qui recupere le texte recue
    //et l'affiche
    private void getMessageTexte()
    {
    if (getEtat()==1)
        {
        String testTexte;
        testTexte=connexionServeur.readTexte();
        if (testTexte.length()>1)
        {
        textareaDialogue.append(testTexte);    
     }
     }
     else
     {
     String testTexte;
     testTexte=connexionClient.readTexte();
     if (testTexte.length()>1)
        {
        textareaDialogue.append(testTexte);    
     }
     }  
    }
     
    //pour lancer la partie client de la connection
    private int creerConnexionClient()
    {
    this.connexionClient= new Chatclient(getAdresseIP());
    return this.connexionClient.getErreur();
    }
     
    //methode qui cree tout les elements de l'interface
    private void creerElements()
    {
    setTitreFenetre("Fenetre de chat" );
    //on cree tous les éléments visuels (boutons, labels, etc...)
    labelInfos = new JLabel("Infos ..." );
    fieldMessage = new JTextField();
    fieldNom = new JTextField();
    labelIP = new JLabel("Adresse IP" );
    labelNom = new JLabel("Pseudo" );
    fieldIP = new JTextField();
    buttonConnecter = new JButton("Se connecter" );
    buttonTest = new JButton("Test" );
    textareaDialogue = new JTextArea();
    scrollDialogue = new JScrollPane();
    //on cree le layout
    getContentPane().setLayout(null);
    setTitle(titreFenetre);
    //si on ferme la fenetre, le programme quitte
    addWindowListener(new WindowAdapter()
        {
        public void windowClosing(WindowEvent evt)
        {
            arreterServeur();
            System.exit(0);
        }
        });
    //on ajoute tous les elements visuels au layout
    getContentPane().add(labelInfos);  
    labelInfos.setBounds(10, 0, 430, 17);
    getContentPane().add(fieldMessage);
    fieldMessage.setBounds(0, 290, 450, 21);
    //evenement quand l'utilisateur appuie sur entree    
    fieldMessage.addKeyListener(new KeyAdapter() {
        public void keyPressed(KeyEvent evt) {
            if (evt.getKeyCode()==evt.VK_ENTER)
            {
            envoyerMessage();
            }
        }
    });
    getContentPane().add(labelIP);
    labelIP.setBounds(10, 20, 65, 20);
    getContentPane().add(labelNom);
    labelNom.setBounds(10, 40, 65, 20);
    getContentPane().add(fieldIP);
    fieldIP.setBounds(80, 20, 100, 21);
    getContentPane().add(fieldNom);
    fieldNom.setBounds(80, 40, 100, 21);
    getContentPane().add(buttonConnecter);
    buttonConnecter.setBounds(190, 20, 110, 20);
     
    buttonConnecter.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent evt) {
         //cas ou le chat est en mode serveur
         //on stoppe donc le cote serveur et on  
         //lance la partie client
         if(getEtat()==1)
         {
         arreterServeur();    
         setTexteInfos("Arret du composant serveur." );
         if(creerConnexionClient()==0)
         {
         setTexteInfos("Composant client initialisé." );
         setBoutonConnexion("Deconnecter" );
         setEtat(2);  
         }
         }    
         //cas ou le chat est en client
         //on se deconnecte et on relance la partie serveur
         else
         {
         arreterClient();    
         setTexteInfos("Arret du composant client." );
         if(creerConnexionServeur()==0)
         {
         setTexteInfos("Composant serveur initialisé." );
         }      
         setEtat(1);    
         setBoutonConnexion("Se connecter" );  
         }    
        }
    });
     
     
     
    getContentPane().add(buttonTest);
    buttonTest.setBounds(190, 40, 110, 20);
     
    buttonTest.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent evt) {    
        getMessageTexte();
        }
    });
     
     
    textareaDialogue.setBounds(0, 90, 450, 190);
    textareaDialogue.setEnabled(false);
    scrollDialogue.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    scrollDialogue.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    scrollDialogue.setBounds(0, 70, 450, 210);
    scrollDialogue.setViewportView(textareaDialogue);
    getContentPane().add(scrollDialogue);
     
    //on definie la taille de la fenetre, puis on l'affiche.
    setSize(460,340);
    show();
   
    }
    //constructeur
    public Chatinterface() {
     creerElements();
     setTexteInfos("Interface initialisée." );
     if(creerConnexionServeur()==0)
        {
        setTexteInfos("Composant serveur initialisé." );
        setEtat(1);    
        }
    startMessageLoop();
    }
}

Reply

Marsh Posté le 07-03-2002 à 15:42:48    

:sweat:  :sweat:  :sweat:

Reply

Marsh Posté le 07-03-2002 à 15:45:05    

c'est quoi l'instruction à la ligne 45
 
Tu me feras déjà gagner du temps


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-03-2002 à 15:46:11    

Oui mais, là, ça fait un peu long  :sweat: .
Ta quoi à la ligne 45 de Chatserveur.java ?


---------------
"Si ça peut déconner, ça va déconner..."
Reply

Marsh Posté le 07-03-2002 à 15:46:21    

testLecture=this.in.ready();
 
dans Chatserveur
 
 
c vrai que sans les numeros de lignes c pas facile, desole  :ange:

 

[jfdsdjhfuetppo]--Message édité par billyboy78--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 07-03-2002 à 15:46:48    

Damned, encore grilled  :D  :lol:


---------------
"Si ça peut déconner, ça va déconner..."
Reply

Marsh Posté le 07-03-2002 à 15:47:38    

Deepcore a écrit a écrit :

Damned, encore grilled  :D  :lol:  




 
de peu ....  :ouch:

Reply

Marsh Posté le 07-03-2002 à 15:49:10    

et c kwa le boutton que tu appuies


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-03-2002 à 15:50:43    

DarkLord a écrit a écrit :

et c kwa le boutton que tu appuies  




 
buttonTest.addMouseListener(new MouseAdapter() {
       public void mouseClicked(MouseEvent evt) {    
       getMessageTexte();
       }
   });
 
celui la, dans Chatinterface ...
 
j'appele en fait exactement la meme methode que dans la boucle...

 

[jfdsdjhfuetppo]--Message édité par billyboy78--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 07-03-2002 à 15:51:13    

Bon bah déjà, c'est ton "BufferedReader in" qui vaut null, mais ça, tout le monde doit s'en douter. :D


---------------
"Si ça peut déconner, ça va déconner..."
Reply

Marsh Posté le 07-03-2002 à 15:51:29    

bon qd t'appuies ca marche bien. Et c'est qd que ca marche aps ton truc alors ?


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-03-2002 à 15:51:49    

Deepcore a écrit a écrit :

Bon bah déjà, c'est ton "BufferedReader in" qui vaut null, mais ça, tout le monde doit s'en douter. :D  




 
tu m'étonnes ;)


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-03-2002 à 15:51:51    

Deepcore a écrit a écrit :

Bon bah déjà, c'est ton "BufferedReader in" qui vaut null, mais ça, tout le monde doit s'en douter. :D  




 
heu non pas moi... comment ca?

Reply

Marsh Posté le 07-03-2002 à 15:52:09    

billyboy78 a écrit a écrit :

 
 
heu non pas moi... comment ca?  




 
PTDR :D


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-03-2002 à 15:53:01    

DarkLord a écrit a écrit :

bon qd t'appuies ca marche bien. Et c'est qd que ca marche aps ton truc alors ?  




 
bah quand j'appele la fonction dans le run() et qu'elle tourne en boucle, la ca deconne...
 
//la classe runnable qui lit les messages  
//je l'est mise ici pour pouvoir acceder aux methodes de Chatinterface  
private class Chattimertexte implements Runnable {  
 
public void run() {  
while (true)  
{  
//System.out.println("coucou" );  
getMessageTexte();  
}  
}

Reply

Marsh Posté le 07-03-2002 à 15:53:52    

DarkLord a écrit a écrit :

 
 
PTDR :D  




 
on se moque pas hein... passer du C++ au java ca fait un choc  :D

Reply

Marsh Posté le 07-03-2002 à 15:54:09    

ok msieur. Pardon j'ai honte  :cry:


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-03-2002 à 15:55:35    

DarkLord a écrit a écrit :

ok msieur. Pardon j'ai honte  :cry:  




 
 
 :ange:  :ange:

Reply

Marsh Posté le 07-03-2002 à 15:58:05    

A part ca, alors ca donne quoi, quelqu'un a une idée sur la chose????

Reply

Marsh Posté le 07-03-2002 à 16:00:11    

ah je crois que j'ai trouve, en effet il semblerait que je lise le buffer alors qu'il n'est pas initialise...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed