Lancer un programme externe avec ActionListener Java

Fermé
Lume_56 Messages postés 26 Date d'inscription lundi 1 juin 2020 Statut Membre Dernière intervention 20 octobre 2023 - Modifié le 30 mars 2022 à 21:22
Lume_56 Messages postés 26 Date d'inscription lundi 1 juin 2020 Statut Membre Dernière intervention 20 octobre 2023 - 17 avril 2022 à 09:51
Bonsoir à tous,
J'ai commencé un programme pour choisir le lancement de VPN dans un menu. Par contre, je n'arrive pas à "lier" l'item au programme à lancer.
Je voudrais lancer le sous-menu "France" avec la commande "sudo cyberghostvpn --traffic --country-code FR --connect".
J'ai déclaré Runtime rt = Runtime.getRuntime(); et ensuite essayé rt.exec(country = "FR" "sudo cyberghostvpn --traffic --country-code FR --connect";), sans résultat.

Voici le code qui fonctionne car j'ai supprimé ce qui provoquait des erreurs. ( je coince également pour les classes RunActionListener et StopActionListener.)


package menuvpn2;


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.IOException;
import javax.swing.ImageIcon;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JFrame;



public class MenuVpn2 {

   private static ActionListener menuItemListener; //  (utilité pour ce script ?)
   private static String country = "FR";

   public static void main(String[] args) {
      
         //création d'une fenêtre JFrame
        JFrame fen=new JFrame("Choisir son VPN");
                        
         //création d'un panneau (JPanel)
        JPanel panel=new JPanel();       
        panel.setLayout(null);
        fen.setSize(500,400);
        fen.setContentPane(panel);
                       
         
         //création de la barre des menus
        JMenuBar myMenuBar=new JMenuBar();
       
         //Ajout de la barre de menus au JPanel
        panel.add(myMenuBar);
         
         //Positionnement de la barre des menus avec la méthode setBounds()
        myMenuBar.setBounds(0, 0, 500, 40);
                        
         //Création du menu Fichier
        JMenu menuTraffic = new JMenu("Traffic");
        JMenu menuStopRun = new JMenu("Run");

         //Ajout du menu à la barre des menus
        myMenuBar.add(menuTraffic);
        myMenuBar.add(menuStopRun);
                                               
        //create menu items  (j'ignore le sens de ces lignes !!!)
        JMenuItem newMenuItem = new JMenuItem("New");
        newMenuItem.setMnemonic(KeyEvent.VK_N);
        newMenuItem.setActionCommand("New");

        // Ajout de sous-menu FR
        JMenuItem trafficFranceItem = new JMenuItem("France");
        trafficFranceItem.addActionListener((event) -> country = "FR");
        menuTraffic.add(trafficFranceItem); 
        
        // Ajout de sous-menu DE
        JMenuItem trafficDEItem = new JMenuItem("Allemagne");
//        trafficDEItem.addActionListener((event) -> country = "DE"); 

        menuTraffic.add(trafficDEItem);

        //Sous-menu run
        JMenuItem runItItem = new JMenuItem("Run");
        runItItem.addActionListener(new RunActionListener()); 
        menuStopRun.add(runItItem);
        JMenuItem stopItItem = new JMenuItem("Stop");
        runItItem.addActionListener(new StopActionListener()); 
        menuStopRun.add(stopItItem);
                       
                       
        fen.setVisible(true);
      }
   
   
   private static class RunActionListener implements ActionListener
   {

      @Override
      public void actionPerformed(ActionEvent e)
      {
         // TODO Auto-generated method stub
         // test values and launch
      }
      
   }
   
   private static class StopActionListener implements ActionListener
   {

      @Override
      public void actionPerformed(ActionEvent e)
      {
         // TODO Auto-generated method stub
         // test values and launch
      }
      
   }
}



Merci pour votre aide !

Message modifié par la modération
Pour une lecture plus facile du code, à l'avenir utilisez les balises, VOIR CETTE PAGE
A voir également:

3 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
3 avril 2022 à 19:11
Bonjour,

Sans préjuger de ce qu'est censé faire la commande cyberghostvpn et si elle est bien écrite, voici comment tu peux l'intégrer à ton programme :

    // Sous-menu run
    JMenuItem runItItem = new JMenuItem("Run");
    runItItem.addActionListener(MenuVpn2::run);
    menuStopRun.add(runItItem);
    JMenuItem stopItItem = new JMenuItem("Stop");
    runItItem.addActionListener(MenuVpn2::stop);
    menuStopRun.add(stopItItem);

    fen.setVisible(true);
}

private static Process process;

private static void run(ActionEvent event) {
    if (process != null)
        return;
    try {
        process = Runtime.getRuntime().exec("sudo cyberghostvpn --traffic --country-code " + country + " --connect");
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    }
}

private static void stop(ActionEvent e) {
    if (process == null)
        return;
    process.destroy();
    process = null;
}

Remarque : il y a des méthodes intéressantes dans la classe Process qui peuvent te permettre de le manipuler, je pense en particulier à getInputStream et getOutputStream pour récupérer ce qu'affiche le programme et lui envoyer des instructions.
0
Lume_56 Messages postés 26 Date d'inscription lundi 1 juin 2020 Statut Membre Dernière intervention 20 octobre 2023 1
3 avril 2022 à 19:44
Merci beaucoup ! Je fais l’essai et te tiens au courant.
0
Lume_56 Messages postés 26 Date d'inscription lundi 1 juin 2020 Statut Membre Dernière intervention 20 octobre 2023 1
17 avril 2022 à 09:51
Bonjour,

J'ai pris du temps et j'ai fait d'autres essais. Le programme se lance bien, par contre, la commande stop n'est pas opérante. Apparemment,
process.destroy();
n'a pas d'effet. On peut arrêter la connexion en ligne de commande avec
sudo cyberghostvpn --stop
que j'ai essayé d'intégrer au projet, sans succès.

Je te joins une version enrichie. Elle inclut le lancement du flux "streaming" qui se lance avec la commande
 process = Runtime.getRuntime().exec("sudo cyberghostvpn --streaming --country-code " + country + " --connect");

J'ai fait un essai mais, là encore, je n'ai pas réussi à l'ajouter.
J'ai également ajouté l'élément Connexion au menu, l'idée étant de connaître le point de connexion. Pour l'instant, je me contente d'un lanceur avec la commande
mate-terminal -x bash -c "curl ifconfig.co/json; exec $SHELL"
, ce qui affiche les informations de connexion dans le terminal. C'est sûrement à modifier.

L'idéal (!) serait de pouvoir se connecter, soit en mode Trafic, soit en mode Streaming sans passer par la touche
run
. On pourrait imaginer voir s'afficher les informations de connexion dans la fenêtre, ce qui supprimerait Connexion du menu.

On aurait ainsi un menu très léger avec Traffic - Streaming - Stop.
Voici le code actuel :


package menuvpn3;

import java.awt.event.ActionEvent;
import java.io.IOException;
import java.io.UncheckedIOException;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JFrame;

public class MenuVpn3 {

private static String country;

public static void main(String[] args) {

//création d'une fenêtre JFrame
JFrame fen = new JFrame("Choisir son VPN - MenuVpn3");

//création d'un panneau (JPanel)
JPanel panel = new JPanel();
panel.setLayout(null);
fen.setSize(500, 400);
fen.setContentPane(panel);

//création de la barre des menus
JMenuBar myMenuBar = new JMenuBar();

//Ajout de la barre de menus au JPanel
panel.add(myMenuBar);

//Positionnement de la barre des menus avec la méthode setBounds()
myMenuBar.setBounds(0, 0, 500, 40);

//Création du menu Fichier
JMenu menuTraffic = new JMenu("Traffic");
JMenu menuStreaming = new JMenu("Streaming");
JMenu menuStopRun = new JMenu("Run");
JMenu menuConnexion = new JMenu("Connexion");

//Ajout du menu à la barre des menus
myMenuBar.add(menuTraffic);
myMenuBar.add(menuStreaming);
myMenuBar.add(menuStopRun);
myMenuBar.add(menuConnexion);

//TRAFFIC
// Ajout de sous-menu Traffic FR
JMenuItem trafficFranceItem = new JMenuItem("France");
menuTraffic.add(trafficFranceItem);
trafficFranceItem.addActionListener((event) -> country = "FR");

// Ajout de sous-menu Traffic DE
JMenuItem trafficDEItem = new JMenuItem("Allemagne");
menuTraffic.add(trafficDEItem);
trafficDEItem.addActionListener((event) -> country = "DE");

// STREAMING

// Ajout de sous-menu Streaming IT
JMenuItem streamingItItem = new JMenuItem("Italie");
menuStreaming.add(streamingItItem);
streamingItItem.addActionListener((event) -> country = "IT");

// Ajout de sous-menu Streaming BE
JMenuItem streamingBeItem = new JMenuItem("Belgique");
menuStreaming.add(streamingBeItem);
streamingBeItem.addActionListener((event) -> country = "BE");


// Sous-menu run Run / Stop
JMenuItem runItItem = new JMenuItem("Run");
runItItem.addActionListener(MenuVpn3::run);
menuStopRun.add(runItItem);
JMenuItem stopItItem = new JMenuItem("Stop");
runItItem.addActionListener(MenuVpn3::stop);
menuStopRun.add(stopItItem);

// Sous-menu Connexion
JMenuItem connexionItem = new JMenuItem("Connecté");
connexionItem.addActionListener(MenuVpn3::connexion);
menuConnexion.add(connexionItem);

fen.setVisible(true);
}

private static Process process;

private static void run(ActionEvent event) {
System.out.println("Connexion en cours");
if (process != null) {
return;
}
try {
process = Runtime.getRuntime().exec("sudo cyberghostvpn --traffic --country-code " + country + " --connect");
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}

private static void stop(ActionEvent e) {
if (process == null) {
return;
}

process.destroy();
process = null;
}

private static void connexion(ActionEvent event) {

System.out.println("Où suis-je connecté ? ");
if (process != null) {
return;
}
try {
process = Runtime.getRuntime().exec("mate-terminal -x bash -c \\\"curl ifconfig.co/json; exec $SHELL\\ ");
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}


PS C'est juste pour te donner un retour. Je vais reprendre le projet en étudiant les méthodes de la classe Process que tu m'as conseillé de découvrir( getInputStream et getOutputStream) et que j'ai "zappées". Par ailleurs, j'ai été pas mal occupé et ce projet n’est qu'un passe-temps.
0