problème avec une classe.... [JAVA] - Programmation
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();
}
Marsh Posté le 07-03-2002 à 11:32:14
En fait, comment je fais tourner ma boucle? dans le run()?
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.
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();
...
}
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.
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
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. @+
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.
Marsh Posté le 07-03-2002 à 12:00:58
Deepcore a écrit a écrit : Voili, voila. |
Comme ça tout est clair.
Marsh Posté le 07-03-2002 à 12:07:58
et pour votre info, MVC est utilisé dans SWING
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 !
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(); ... } |
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 :
|
[jfdsdjhfuetppo]--Message édité par DarkLord--[/jfdsdjhfuetppo]
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"
|
Merci merci , c cool, je n'en demandais pas tant
Marsh Posté le 07-03-2002 à 13:58:16
billyboy78 a écrit a écrit : Merci merci , c cool, je n'en demandais pas tant |
Bin euh de rien. j'ai pas fait grand chose
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....
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();
}
}
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
Marsh Posté le 07-03-2002 à 15:46:11
Oui mais, là, ça fait un peu long .
Ta quoi à la ligne 45 de Chatserveur.java ?
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
[jfdsdjhfuetppo]--Message édité par billyboy78--[/jfdsdjhfuetppo]
Marsh Posté le 07-03-2002 à 15:46:48
Damned, encore grilled
Marsh Posté le 07-03-2002 à 15:47:38
Deepcore a écrit a écrit : Damned, encore grilled |
de peu ....
Marsh Posté le 07-03-2002 à 15:49:10
et c kwa le boutton que tu appuies
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]
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.
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 ?
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. |
tu m'étonnes
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. |
heu non pas moi... comment ca?
Marsh Posté le 07-03-2002 à 15:52:09
billyboy78 a écrit a écrit : heu non pas moi... comment ca? |
PTDR
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();
}
}
Marsh Posté le 07-03-2002 à 15:53:52
DarkLord a écrit a écrit : PTDR |
on se moque pas hein... passer du C++ au java ca fait un choc
Marsh Posté le 07-03-2002 à 15:54:09
ok msieur. Pardon j'ai honte
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????
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...
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
}
}