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

avec Java Discussion :

Mise en place (et compréhension) d'un Listener personnalisé


Sujet :

avec Java

  1. #1
    Membre averti
    Homme Profil pro
    Apprenti Ingé
    Inscrit en
    Janvier 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti Ingé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 12
    Par défaut Mise en place (et compréhension) d'un Listener personnalisé
    Bonjour à tous !

    Je suis en train de coder un client SSH en java à l'aide de la libriaire Jsch !
    J'ai un soucis avec une des focntions que je veux dévolepper, je m'explique :
    Je souhaite avoir une box qui me donne l'état de la connexion ssh (connecté, déconnecté, ...). Pour cela j'ai pensé à utiliser les listeners (notion que je découver en même temps).
    J'ai lu plusieurs tutos et sujet sur différents forum, notament :
    http://rom.developpez.com/java-listeners/
    http://java.developpez.com/faq/gui/?...eners_Methode1
    Mais j'ai du mal à comprendre le truc

    Mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public interface StateListener extends EventListener {
     
    	void stateModified(Boolean oldState, Boolean newState);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    public class Fenetre extends JFrame implements StateListener {
     
    	private JPanel container = new JPanel();
    	private static Console console = new Console();
    	private JScrollPane scroll = new JScrollPane(console);
    	private JTextArea logBox = new JTextArea();
    	private JScrollPane scroll2 = new JScrollPane(logBox);
     
    	private GridBagLayout layout = new GridBagLayout();
    	private GridBagConstraints gbc = new GridBagConstraints();
     
    	public Console() throws IOException{
     
    		// Config Fenêtre
     
    		console .addListener(this);
    		// Config JTextArea Console
    		// Config JTextArea Log
     
    		// Config Container
     
    		// Config GriBagLayout
     
    		logBox.append("Connexion en cours ...\n");
     
    		this.setContentPane(container);
    		this.setVisible(true);
     
    	}
     
    	@Override
    	public void stateModified(Boolean oldState, Boolean newState) {
     
    		if(oldState != newState) 
    		{
    			if(newState)
    			{
    				logBox.append("Connecté ...");
    			}
    			else logBox.append("Déconnecté ...");
     
    		}
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
     
    public class Console extends JTextArea {
     
    	private JSch jsch = new JSch();
    	private Channel channel;
    	private user;
    	private host;
    	private port;
    	private password;
     
    	private Thread t;
     
    	List<StateListener> listener = new ArrayList<StateListener>();
    	private Boolean n = false;
    	private Boolean o = false;
     
    	public Console(String fileName){
     
    		user = "*****";			
    		host = "*****";	
    		port = "*****";	
    		password = "*****";	
     
    		t = new Thread( new  Lancer());
    		t.start();
    	}
     
     
    	public void connecter() throws IOException, JSchException{
     
    		// Configuration connexion Jsch
     
    	} 
     
     
    	public void addListener(StateListener Listener){
    		listener.add(Listener);
    	}
     
    	public void getState(){
     
    		n = (channel != null && channel.isConnected());
     
    			for(StateListener sl : listener)
    			{
    				sl.stateModified(o, n);
    			}
    		o = n;		
    	}
    	class Lancer implements Runnable { // Utilisation des threads
     
    		public void run() {
    			try {
     
    				connecter();
     
    			} catch (IOException | JSchException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    }
    Je sais pas si vous avez compris quelque chose mais si il y a besoin de plus de renseignement je les rajouterais
    J'espère que vous pourrez me faire comprendre ce qui m'échappe =)

    Merci d'avance les amis !

    Julian

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Ta méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void getState(){
     
    		n = (channel != null && channel.isConnected());
     
    			for(StateListener sl : listener)
    			{
    				sl.stateModified(o, n);
    			}
    		o = n;		
    	}
    doit être appelée quand l'état change, c'est à dire dans ta méthode connecter(), mais également lors de la déconnexion (volontaire, donc avec une méthode deconnecter() que je ne vois nulle part, ou sur erreur, peut être, ou tout autre moyen que la lib jsch t'offre pour savoir que la connexion n'est plus valide).

    Communément, ce type de méthode s'appelle plutôt firexxx, par exemple dans ton cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private void fireStateChanges() {
    boolean n = (channel != null && channel.isConnected());
     
        if ( o!=n ) {
    			for(StateListener sl : listener)
    			{
    				sl.stateModified(o, n);
    			}
    		o = n;	
       }
    }
    Tu remarqueras, en rouge, que j'ai ajouté une condition pour éviter que les évènements ne soient envoyés si l'état ne change pas : ainsi, la méthode pourra être appelé de n'importe ou.

    En plus, je pense que tu dois éviter de gérer les états avec des variables internes, sauf vraiment si l'API que tu utilises ne permet pas de faire autrement. En tout cas, vaut mieux que tu utilises du boolean plutôt que du Boolean, tu n'auras pas de problème avec les comparaisons du type == ou !=, au moins. Et puis, il n'est pas spécialement utile de stocker les deux états, mais uniquement l'ancien, le nouveau pouvant très bien être local à la méthode fireStateChanges().



    Sinon, tu ne dis pas réellement le problème que tu rencontres
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Apprenti Ingé
    Inscrit en
    Janvier 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti Ingé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 12
    Par défaut
    Merci beaucoup pour ta réponse =)

    Je vais essayé ça !
    Pour la déconnexion c'est automatique.

    Mon problème était que je ne comprenais vraiment pas comment faire ^^

    Merci encore je vous tiens au jus !

    Julian

Discussions similaires

  1. [FLASH 8][AS2][OFFLINE]Mise en place d'un Listener sur un combobox
    Par -=OAZ=- dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 27/03/2008, 10h18
  2. [AD]Mise en place de Active Directory
    Par guiguisi dans le forum Windows Serveur
    Réponses: 9
    Dernier message: 29/07/2004, 08h50
  3. [C#] Mise en place d'un site multilingue
    Par regbegpower dans le forum ASP.NET
    Réponses: 6
    Dernier message: 19/03/2004, 19h15
  4. mise en place serveur web intranet
    Par gui4593 dans le forum Installation
    Réponses: 7
    Dernier message: 01/01/2004, 18h18
  5. Mise en place d'index....??
    Par liv dans le forum Requêtes
    Réponses: 6
    Dernier message: 18/12/2003, 11h04

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