2010-07-11 29 views
6

Làm cách nào tôi có thể đọc một ký tự/khóa từ bàn điều khiển mà không phải nhấn Enter? Có một số old entry in Sun's bug database tuyên bố rằng nó không thể được thực hiện bằng java thuần túy. Tôi đã tìm thấy những cách tiếp cậnĐầu vào bảng điều khiển ký tự đơn trong java/clojure

tôi mong đợi để thêm một đơn magic-readkey.jar vào classpath của tôi, và viết một vài dòng mã, như (def just-hit (com.acme.MagicConsole/read-char)).

Trả lời

11

Dưới đây là một "echo ngay lập tức" ứng dụng sử dụng JLine mà sẽ in int s tương ứng với bấm phím đăng ký, có cấu trúc như một dự án Leiningen:

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

Chức năng được đề cập được cung cấp bởi lớp jline.Terminal, cung cấp phương thức tĩnh getTerminal trả về phiên bản của phân lớp nền tảng cụ thể có thể được sử dụng để tương tác với thiết bị đầu cuối. Xem Javadoc để biết thêm chi tiết.

Hãy xem những gì trông giống như asdf ...

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

(Cc vẫn giết ứng dụng, tất nhiên.)

+0

như thế nào là câu trả lời chấp nhận điều này? jline vẫn requiers nhập key ... – Enerccio

+0

Nếu bạn thử mã trên, bạn sẽ thấy rằng nó thực tế làm việc mà không cần nhập/trả lại. (Đã được xác minh ngay bây giờ trên một hộp Ubuntu với openjdk-8-jdk. Có vẻ như clojure-contrib 1.1.0 không còn có sẵn ở miền Trung nữa, nhưng bạn có thể xóa nó đi và mọi thứ vẫn hoạt động - các phiên bản phụ thuộc không cập nhật bởi vì câu trả lời này có từ năm 2010.) –

+0

Không chắc chắn, nhưng Termina của tôi.readCharacter chỉ cần đọc từ System.in và vẫn cần phải đợi nhập – Enerccio

1

Nếu bạn muốn sử dụng jline2 có một lớp ConsoleReader sẵn mà làm khá nhiều điều tương tự Michał Marczyk giải thích ở trên:

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


(defn -main [& args] 
    (while true (->> (ConsoleReader.) (.readCharacter) (println)))) 
Các vấn đề liên quan