質問

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

私は単一を追加することを期待するだろう magic-readkey.jar 私のクラスパスに、そして次のような数行のコードを書くために (def just-hit (com.acme.MagicConsole/read-char)).

役に立ちましたか?

解決

これが印刷されるJLineを使用した「即時エコー」アプリです int登録されたキー押下に対応するsは、aとして構成されています ライニンゲン プロジェクト:

  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 もちろん、まだアプリを殺します。)

他のヒント

2015年以降にこれを読んでいる可能性がある人のために、より最近のJlineのバージョンがメソッドTerminal/getTerminalを持っていないことに注意してください。Jline2でこれを行うためのもう1つ(おそらくより良い)方法があると確信していますが、常にjline "0.9.94"を使用するだけで、承認された回答は少なくともCloJure 1.6までのうちに機能します(注意事項はもう必要ありません。clojure.contrib)。

代替案として、私は優れた clojure-lanterna をお勧めします。java lanterna ライブラリ。 docs 、読み取りのためのget-keyおよびget-key-blocking関数があります。入力の単一文字で。

JLIN2を使用したい場合は、上で説明したMichałMarczykがほとんど同じことがあるConsoleReaderクラスがあります。

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


(defn -main [& args]
  (while true (->> (ConsoleReader.) (.readCharacter) (println))))
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top