Partage
  • Partager sur Facebook
  • Partager sur Twitter

probleme de pause

Sujet résolu
    3 juillet 2008 à 14:12:16

    Bonjour, pour mon projet j'ai besoin d'utiliser les interfaces graphiques.
    alors un peu d'explication:
    je voudrai que tant que l'utilisateur n'appuie pas sur un boutton, le conde attende. Et une fois que l'utilisateur a appuyé sur un boutton, on continue la suite du code.
    Voici le code client:

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.BufferedOutputStream;
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.util.Scanner;
    
    import javax.swing.JButton;
    
    
    public class client implements ActionListener {
    	
    	public static String nomFichier = null;
    	
    	public static void main(String[] args) throws Exception {
    		Fenetre fen = new Fenetre();
    		InetAddress ip = InetAddress.getLocalHost();
    		int port = 9333;
    		Socket client = new Socket(ip, port);
    	    BufferedWriter writer = null;
    		BufferedReader reader = null;
    		File fichier_ou_ecrire = null;
    		BufferedOutputStream writerFichier = null;
    		try {
    		 writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
    		//Scanner sc = new Scanner(System.in);
    		fen.Afficheur.setText("Veuillez écrire le nom fichier en mettant des _ a la place des espaces et en precisant son extansion\n");
    		//String nomFichier = sc.nextLine();
    		
    		writer.write(nomFichier + "\n");
    		writer.flush();
    	     reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
    		 fichier_ou_ecrire = new File(nomFichier);
    		 writerFichier = new BufferedOutputStream(new FileOutputStream(fichier_ou_ecrire));
    		int OctetLu = 0;
    		fen.Afficheur.setText("Début du transfert du fichier: " + nomFichier);
    		while(true) {
    		byte[] tableauOctet = new byte[64000];
    			OctetLu = client.getInputStream().read(tableauOctet);
    			
    			if(client.isConnected() == false || OctetLu == -1)
    				break;
    			
    			writerFichier.write(tableauOctet,0,OctetLu);
    			writerFichier.flush();
    		}
    		
    		System.out.println("l'ecriture s'est normalement déroulée");
    		}catch(Exception e) {
    			e.printStackTrace();
    			System.out.println("fatal error");
    		}finally {
    			try {
    				writer.close();
    				reader.close();
    				writerFichier.close();
    		}catch(Exception e) {
    			fen.Afficheur.setText("fatal error");
    		}
    		
    	}
    
    }
    	
    	public void actionPerformed(ActionEvent arg0) {
    		JButton evenement = (JButton) arg0.getSource();
    		String libelle = evenement.getText();
    		nomFichier = libelle;
    	}
    
    }
    


    et le code de la fenetre au cas ou:

    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    
    	public class Fenetre extends JFrame {
    		
    		JPanel pan = new JPanel();
    		JPanel panBoutton = new JPanel();
    		JLabel Afficheur = new JLabel();
    		BorderLayout disposition = new BorderLayout();
    		GridLayout dispositionBoutton = new GridLayout(1,1);
    		JButton bouttonFinal12 = new JButton("final fantasy 12: revenant wings");
    		
    		public Fenetre() {
    			pan.setLayout(disposition);
    			pan.add(Afficheur, disposition.NORTH);
    			panBoutton.setLayout(dispositionBoutton);
    			panBoutton.add(bouttonFinal12);
    			pan.add(panBoutton, disposition.SOUTH);
    			client cl = new client();
    			bouttonFinal12.addActionListener(cl); //le boutton est ecouté par l'obejet appelant, c'est a dire la fenetre
    			this.setTitle("serveur d'echange");
    			this.setSize(300, 300);
    			this.setLocationRelativeTo(null);
    			this.setContentPane(pan);
    			this.setVisible(true);
    			this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    		}
    
    }
    


    Donc le code client doit envoyer le nom d'un fichier. il aut cliquer sur le boutton correspondant, mais manque de pot, le code n'attend pas que l'on ai cliqué sur un boutton, l continue et me met une erreur, ce qui es normal vu que le nom du fichier est nul.

    Alors voila, si quelqu'un à une idée...
    • Partager sur Facebook
    • Partager sur Twitter
      4 juillet 2008 à 20:50:19

      il ne faut pas faire comme tu as fait. Dans ton main tu vire tout ce qui est propre à ton traitement que tu dois faire et tu le met dans une méthode à laquelle tu fais appel dans ton actionPerformed
      • Partager sur Facebook
      • Partager sur Twitter
        5 juillet 2008 à 9:47:44

        en fait j'ai tout mit dans l'action performed^^
        Merci de ta reponse
        • Partager sur Facebook
        • Partager sur Twitter
          5 juillet 2008 à 13:17:16

          Citation

          en fait j'ai tout mit dans l'action performed^^


          Si on veut être 100% clean, pour les longues opérations genre transfert de fichier, il faudrait un thread séparé...

          public void actionPerformed (ActionEvent e) {
          (new Thread(new Runnable(){
          public void run () {
          // ...
          }}
          )).start();
          }
          


          Ou mieux, avec les SwingWorkers, mais je n'ai jamais utilisé donc je ne peux plus t'aider là.

          Ca ne pose aucun problème pour accéder aux variables puisque c'est une classe anonyme. Juste si tu veux l'ActionEvent je crois qu'il faut le mettre final. Par contre si ton ActionListener est lui-même une classe anonyme, je ne sais pas si on peut les imbriquer, faudrait essayer.
          • Partager sur Facebook
          • Partager sur Twitter

          probleme de pause

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown