Question

Comment puis-je lire un seul caractère/la clé de la console sans avoir à taper Entrée?Il y a un ancienne entrée dans le Soleil de la base de données de bogues en prétendant qu'elle ne peut pas être fait en java pur.J'ai trouvé ces approches

Je m'attends à ajouter un seul magic-readkey.jar à mon classpath, et d'écrire quelques lignes de code, comme (def just-hit (com.acme.MagicConsole/read-char)).

Était-ce utile?

La solution

Voici un "écho immédiat" de l'app à l'aide de JLine qui permet d'imprimer ints correspondant à un régime enregistré d'appuis sur les touches, structuré comme un Leiningen projet:

  1. project.clj:

    (defproject con "1.0.0-SNAPSHOT"
      :description "FIXME: write"
      :main con.core
      :dependencies [[org.clojure/clojure "1.1.0"]
                     [org.clojure/clojure-contrib "1.1.0"]
                     [jline "0.9.94"]])
    
  2. src/con/core.clj:

    (ns con.core
      (:import jline.Terminal)
      (:gen-class))
    
    (defn -main [& args]
      (let [term (Terminal/getTerminal)]
        (while true
          (println (.readCharacter term System/in)))))
    

La fonctionnalité en question est fourni par le jline.Terminal de la classe, qui fournit une méthode statique getTerminal retourner une instance de la plate-forme sous-classe spécifique qui peut être utilisé pour interagir avec le terminal.Voir la Javadoc pour plus de détails.

Voyons ce que asdf ressemble...

$ java -jar con-1.0.0-SNAPSHOT-standalone.jar 
97
115
100
102

(C-c tue encore l'application, bien sûr.)

Autres conseils

Pour n'importe qui qui peut être la lecture de cet en 2015 et au-delà, notez que les versions plus récentes de JLine n'ont plus la méthode Terminal/getTerminal.Je suis sûr qu'il y en est une autre (peut-être mieux) façon de le faire maintenant avec JLine2, mais vous pouvez toujours l'utiliser jline "0.9.94" et l'on a accepté de répondre à fonctionnera toujours, au moins jusqu'à Clojure 1.6 (de la note, vous n'avez plus besoin d'exiger clojure.contrib).

Comme une alternative, je vous recommande l'excellent clojure-lanterna, qui est un Clojure wrapper autour de la Java Lanterna de la bibliothèque.Comme vous pouvez le voir dans les docs, il y a get-key et get-key-blocking les fonctions de la lecture dans de simples caractères de l'entrée.

Si vous souhaitez utiliser jline2 il y a un ConsoleReader classe disponible, ce qui fait à peu près la même chose Michał Marczyk expliqué ci-dessus:

(ns con.core
  (:import jline.console.ConsoleReader)
  (:gen-class))


(defn -main [& args]
  (while true (->> (ConsoleReader.) (.readCharacter) (println))))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top