Comment fermer le processus java lorsque l'on quitte le programme ?

Comment fermer le processus java lorsque l'on quitte le programme ? - Java - Programmation

Marsh Posté le 16-07-2009 à 18:22:29    

Bonjour.
Je suis en train de faire un programme en Java, un logiciel de chat précisément.
Le problème, c'est que lorsque je souhaite quitter le programme, en passant par la fameuse croix en haut à droite de la fenêtre, le processus java ne se ferme pas. Il reste actif. Ainsi, après plusieurs utilisation du programme, je me retrouve avec une dizaine de processus java qui tournent  :pt1cable:  
La question est simple: Que faut-il ajouter au code pour que, lorsque le programme se ferme, le processus java s'arrête également ?
 
Code source du programme (Client):
 

Citation :

import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
public class Komunicator {
 
      JTextArea entrants;
      JTextField sortants;
      BufferedReader lecture;
      PrintWriter ecriture;
      Socket sock;
 
      public static void main(String[] args) {
          Komunicator client = new Komunicator();
          client.go();
      }
 
      public void go() {
 
            JFrame cadre = new JFrame("Komunicator" );
            JPanel panneau = new JPanel();
            entrants = new JTextArea(15,50);
            entrants.setLineWrap(true);
            entrants.setWrapStyleWord(true);
            entrants.setEditable(false);
            JScrollPane zoneTexte = new JScrollPane(entrants);
            zoneTexte.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
            zoneTexte.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
            sortants = new JTextField(20);
            JButton boutonEnvoi = new JButton("Envoi" );
            boutonEnvoi.addActionListener(new EcouteBoutonEnvoi());
            panneau.add(zoneTexte);
            panneau.add(sortants);
            panneau.add(boutonEnvoi);
            installerReseau();
 
            Thread threadLecture = new Thread(new LectureEntrants());
            threadLecture.start();
 
            cadre.getContentPane().add(BorderLayout.CENTER, panneau);
            cadre.setSize(400,500);
            cadre.setVisible(true);
 
} //Fin de la méthode go()
 
      private void installerReseau() {
 
             try {
                 sock = new Socket("127.0.0.1", 5000);
                 InputStreamReader isr = new InputStreamReader(sock.getInputStream());
                 lecture = new BufferedReader(isr);
                 ecriture = new PrintWriter(sock.getOutputStream());
                 System.out.println("Connexion établie" );
             } catch(IOException ex) {
                ex.printStackTrace();
             }
      } // Fin de la méthode installerReseau()
 
 
       public class EcouteBoutonEnvoi implements ActionListener {
          public void actionPerformed(ActionEvent ev) {
              try {
                 ecriture.println(sortants.getText());
                 ecriture.flush();
 
              } catch(Exception ex) {
                 ex.printStackTrace();
              }
               sortants.setText("" );
               sortants.requestFocus();
       }
  } // Fin de la classe interne
 
       
       public class LectureEntrants implements Runnable {
          public void run() {
                 String message;
                 try {
 
                   while ((message = lecture.readLine()) !=null) {
                     System.out.println("lire " + message);
                     entrants.append(message + "\n" );
 
                  } // Fin de la boucle while
             } catch(Exception ex) {ex.printStackTrace();}
     } // Fin de la méthode run()
} // Fin de la classe interne
 
} // Fin de la classe externe


 
Merci  :jap:


Message édité par Profil supprimé le 16-07-2009 à 18:22:41
Reply

Marsh Posté le 16-07-2009 à 18:22:29   

Reply

Marsh Posté le 16-07-2009 à 19:59:36    

tu peux peut etre regarder du cote de : http://java.sun.com/j2se/1.5.0/doc [...] n%28int%29
 
ou pour plus de control, tu utilises un WindowListener: http://java.sun.com/j2se/1.5.0/doc [...] tener.html


Message édité par souk le 16-07-2009 à 20:01:26
Reply

Marsh Posté le 16-07-2009 à 22:38:24    

Merci, je vais essayer

Reply

Marsh Posté le 16-07-2009 à 23:10:57    

sur ta frame principale, tu peux essayer la méthode:
 
JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
 
je ne suis plus sur des noms, je te donne ça de mémoire

Reply

Marsh Posté le 17-07-2009 à 09:24:09    

Tu devrais également arrêter ton thread de lecture.


---------------
Light is right
Reply

Marsh Posté le 17-07-2009 à 10:10:15    

J'ai essayé la manip' de liouan. Le problème, c'est qu'il n'y a pas de changement xD
Je comprends pas, je suis vraiment un manche en Java :o

 

J'ai rajouté:

 
Citation :

JFrame frame = new JFrame("Quit" );
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

Dans

 
Citation :

public static void main(String[] args) {
          Komunicator client = new Komunicator();
          client.go();
      }


Ce qui nous fait:

 
Citation :

     public static void main(String[] args) {
          Komunicator client = new Komunicator();
          client.go();
          JFrame frame = new JFrame("Quit" );
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

     }

 

Je lance le programme, je le ferme par la croix et j'observe les processus qui tournent; java reste en mémoire -_-

 

... Des suggestions ?

 

Merci :D

 

PS:

nerisson a écrit :

Tu devrais également arrêter ton thread de lecture.


Je vais essayer ta manip' maintenant ;)

Message cité 1 fois
Message édité par Profil supprimé le 17-07-2009 à 10:12:49
Reply

Marsh Posté le 17-07-2009 à 10:21:46    


 :heink:  
Regarde ce que tu fais...
Ta frame là dans le main ne sert à rien car tu ne l'utilises pas !! La fenêtre qui s'affiche n'a rien à voir avec cette frame. Le setDefaultCloseOperation il faut le faire sur la frame que tu utilises évidemment donc celle qui se trouve dans go().


Message édité par Deamon le 17-07-2009 à 10:23:23
Reply

Marsh Posté le 17-07-2009 à 10:48:10    

Ah. Pas grave car, J'AI FINALEMENT TROUVÉ !
J'utilise un nouveau bouton (je suis bête de ne pas y avoir pensé avant), qui ferme tout simplement l'application grâce à un System.exit(0)
Du coup maintenant tout fonctionne comme je le souhaite.

 

Mais je vais creuser quand même un peu pour que celà marche en passant par la petite croix.

 

@Daemon: Je vais essayer ça, merci beaucoup ;)

 

Edit: Voilà à quoi ressemble ma méthode go() maintenant:

 
Citation :

     public void go() {

 

           JFrame frame = new JFrame("Quit" );
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JFrame cadre = new JFrame("Komunicator" );
            JPanel panneau = new JPanel();                    
            entrants = new JTextArea(15,50);
            entrants.setLineWrap(true);
            entrants.setWrapStyleWord(true);
            entrants.setEditable(false);
            JScrollPane zoneTexte = new JScrollPane(entrants);
            zoneTexte.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
            zoneTexte.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
            sortants = new JTextField(20);
            JButton boutonEnvoi = new JButton("Envoi" );
            boutonEnvoi.addActionListener(new EcouteBoutonEnvoi());
            panneau.add(zoneTexte);
            panneau.add(sortants);
            panneau.add(boutonEnvoi);
            JButton Quitter = new JButton("Quitter" );
            Quitter.addActionListener(new Quitter());
            panneau.add(Quitter);

 

           installerReseau();
 
            Thread threadLecture = new Thread(new LectureEntrants());
            threadLecture.start();

 

           cadre.getContentPane().add(BorderLayout.CENTER, panneau);
            cadre.setSize(400,500);
            cadre.setVisible(true);

 


} //Fin de la méthode go()

 

A noter que j'ai bien entendu viré la frame Quit dans le static void main.
Le problème, c'est qu'avec cette méthode, cela ne marche toujours pas en passant par la croix ...


Message édité par Profil supprimé le 17-07-2009 à 10:53:00
Reply

Marsh Posté le 17-07-2009 à 10:52:09    

Oui regarde ça de près car ta solution n'est vraiment pas top à moins d'interdire à l'utilisateur d'utiliser la croix.

Reply

Marsh Posté le 17-07-2009 à 11:05:02    

Haaa, voilà c'est bon j'ai trouvé. Merci beaucoup Deamon de m'avoir orienté sur la bonne piste. En fait, voilà, j'ai rajouté tout simplement  

Citation :

cadre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

dans la méthode go()
Je ne sais pas pourquoi j'ai voulu créé une autre JFrame que celle qui était déjà créée. Fin bref, maintenant tout est rentré dans l'ordre.
Pour quitter le programme et tuer le processus java, le bouton Quitter fonctionne ainsi que la croix.
 
Merci à tous ;)

Reply

Sujets relatifs:

Leave a Replay

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