8

Enterキーを押さなくても、コンソールから1つの文字/キーを読み取るにはどうすればよいですか?Sunのバグデータベースには、純粋なJavaでは実行できないと主張する古いエントリがあります。私はこれらのアプローチを見つけました

クラスパスにシングルを追加しmagic-readkey.jar、のような数行のコードを書くことを期待してい(def just-hit (com.acme.MagicConsole/read-char))ます。

4

3 に答える 3

12

これは、 Leiningenプロジェクトintとして構造化された、登録されたキー押下に対応するを印刷するJLineを使用した「即時エコー」アプリです。

  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)))))
    

問題の機能はクラスによって提供されます。このクラスは、端末との対話に使用できるプラットフォーム固有のサブクラスのインスタンスを返すjline.Terminal静的メソッドを提供します。getTerminal詳細については、Javadocを参照してください。

どのように見えるか見てみましょうasdf...

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

C-cもちろん、それでもアプリを強制終了します。)

于 2010-07-11T23:45:27.407 に答える
4

2015年以降にこれを読んでいる可能性のある人は、JLineの最新バージョンにメソッドがないことに注意してくださいTerminal/getTerminal。JLine2でこれを行う別の(おそらくより良い)方法があると確信していますが、いつでも使用できjline "0.9.94"、受け入れられた答えは、少なくともClojure 1.6までは機能します(注意してください、もはや必要ありませんclojure.contrib) 。

別の方法として、 JavaLanternaライブラリのClojureラッパーである優れたclojure-lanternaをお勧めします。ドキュメントでわかるように、入力の1文字を読み取るための関数があります。get-keyget-key-blocking

于 2015-04-09T15:18:06.520 に答える
2

jline2を使用したい場合は、MichałMarczykがConsoleReader上で説明したのとほぼ同じことを行うクラスが利用可能です。

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


(defn -main [& args]
  (while true (->> (ConsoleReader.) (.readCharacter) (println))))
于 2015-11-19T18:17:17.653 に答える