11
votes

Java Keylistener en ligne de commande

La plupart des démonstrations montrant l'événement en swing, quelle est l'équivalent en ligne de commande?


0 commentaires

4 Réponses :


10
votes

Swing est différent d'un environnement de ligne de commande dans le sens où vous n'avez pas événements dans une fenêtre de console. Une interface graphique standard traite des objets et des événements. Une console n'a pas de notion équivalente de ce type.

Qu'est-ce que vous DO avez-vous une entrée standard (ainsi qu'une sortie standard), que vous pouvez lire à partir de. Voir Cette question sur la façon de lire un seul caractère de la console (sans attendre une nouvelle ligne) - ou plutôt, sur la manière dont cela n'est pas très facile à faire en Java.

Bien sûr, vous pouvez toujours faire la lecture de manière asynchrone sur un fil séparé. C'est-à-dire le fil principal continuera de faire des trucs, avec un fil d'auditeur qui attend sur l'appel de blocage d'E / S. Mais cela ne peut être mis en œuvre et traités que sur le niveau d'application.


0 commentaires

6
votes

Vous pouvez utiliser bufferedreader code> dans une boucle:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line = "";

   while (line.equalsIgnoreCase("quit") == false) {
       line = in.readLine();

       //do something
   }

   in.close();


0 commentaires

4
votes

Keylistener est uniquement pour les classes swing.

Pour avoir une fonctionnalité équivalente dans une application de ligne de commande, vous pouvez utiliser le jnnativehook bibliothèque qui accomplit cette via JNI . Cela vous permettra d'écouter les raccourcis globaux ou le mouvement de la souris qui serait autrement impossible en utilisant Pure Java. Vous n'avez pas non plus besoin d'utiliser balançoire ou d'autres classes d'interface graphique.


2 commentaires

La "bibliothèque JnativeHook" n'aide pas si vous souhaitez gérer la combinaison de touches "Ctrl + C" - le programme se terminera de manière habituelle.


Notez que JNATIVEHOOK nécessite que X11 fonctionne (au moins jusqu'à la version 2.1.0) en fonction de ce problème: github.com/kwhat/jnativehook/issues/162 . Par exemple, j'ai essayé de l'utiliser dans un conteneur Docker et il n'a pas fonctionné.



5
votes

Le code suivant empêchera la combinaison CTRL + C d'arrêter un programme CLI Java.

import sun.misc.Signal; 
import sun.misc.SignalHandler;

    Signal.handle(new Signal("INT"), new SignalHandler() {
      // Signal handler method
      public void handle(Signal signal) {
        System.out.println("Got signal" + signal);
      }
    });


1 commentaires

Qu'est-ce qu'un programme CLI Java?