2010-10-23 12 views

Répondre

8

Swing est différent d'un environnement de ligne de commande en ce sens que vous n'avez aucun é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.

Ce que vous avez est une entrée standard (ainsi qu'une sortie standard), que vous pouvez lire. Voir this question sur la façon de lire un seul char de la console (sans attendre un retour à la ligne) - ou plutôt, sur comment cela n'est pas très facile à faire en Java.

Bien sûr, vous pouvez toujours effectuer la lecture de manière asynchrone sur un thread séparé. c'est-à-dire que le thread principal continue de faire des choses, avec un thread d'écoute qui attend l'appel de blocage d'E/S. Mais ceci ne peut être implémenté et géré qu'au niveau de l'application.

4

vous pouvez utiliser BufferedReader 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

fonctionne très bien, merci! – Buffalo

4

KeyListener est que pour les classes de swing.

Pour avoir une fonctionnalité équivalente dans une application de ligne de commande, vous pouvez utiliser la bibliothèque JNativeHook qui l'accomplit via JNI. Cela vous permettra d'écouter les raccourcis globaux ou les mouvements de la souris qui seraient autrement impossibles en Java pur. Vous n'avez également pas besoin d'utiliser Swing ou d'autres classes d'interface graphique.

+0

La bibliothèque "JNativeHook" n'aide pas si vous voulez gérer la combinaison de touches "Ctrl + C" - le programme se termine de la manière habituelle. – javauser71

+0

Notez que JnativeHook nécessite X11 pour fonctionner (au moins jusqu'à la version 2.1.0) selon ce problème: https://github.com/kwhat/jnativehook/issues/162. Par exemple, j'ai essayé de l'utiliser dans un conteneur Docker et cela n'a pas fonctionné. – Kenairod

2

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

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); 
     } 
    }); 
+0

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

+0

CLI - Interface de ligne de commande ... Je pense. – Joe

Questions connexes