2010-10-23 31 views

Trả lời

8

Swing khác với môi trường dòng lệnh theo nghĩa là bạn không có sự kiện trong cửa sổ bảng điều khiển. Giao diện GUI chuẩn với các đối tượng và sự kiện. Một giao diện điều khiển không có khái niệm tương đương như vậy.

Điều bạn làm có đầu vào chuẩn (cũng như đầu ra tiêu chuẩn) mà bạn có thể đọc từ đó. Xem this question về cách đọc một char đơn lẻ từ bảng điều khiển (mà không cần đợi một dòng mới) - hay đúng hơn, về cách thức này không dễ thực hiện trong Java.

Tất nhiên, bạn luôn có thể thực hiện việc đọc không đồng bộ trên một chuỗi riêng biệt. tức là chủ đề chính sẽ tiếp tục làm công cụ, với chuỗi người nghe đang chờ cuộc gọi chặn I/O. Nhưng điều này chỉ có thể được thực hiện và xử lý ở cấp ứng dụng.

4

bạn có thể sử dụng BufferedReader trong một vòng lặp:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
String line = ""; 

    while (line.equalsIgnoreCase("quit") == false) { 
     line = in.readLine(); 

     //do something 
    } 

    in.close(); 
+0

hoạt động tuyệt vời, cảm ơn! – Buffalo

4

KeyListener chỉ dành cho các lớp học swing.

Để có chức năng tương đương trong ứng dụng dòng lệnh, bạn có thể sử dụng thư viện JNativeHook để hoàn thành điều này qua JNI. Điều này sẽ cho phép bạn nghe các phím tắt hoặc chuyển động chuột toàn cục nếu không sẽ không thể sử dụng Java thuần túy. Bạn cũng không cần sử dụng Swing hoặc các lớp GUI khác.

+0

"Thư viện JNativeHook" không giúp bạn nếu bạn muốn xử lý tổ hợp phím "Ctrl + C" - chương trình sẽ bị chấm dứt theo cách thông thường. – javauser71

+0

Lưu ý rằng JnativeHook yêu cầu X11 hoạt động (ít nhất là lên phiên bản 2.1.0) theo vấn đề này: https://github.com/kwhat/jnativehook/issues/162. Ví dụ tôi đã cố gắng sử dụng nó trong một thùng chứa Docker và nó không hoạt động. – Kenairod

2

Mã sau sẽ ngăn kết hợp Ctrl + C ngừng chương trình 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

Chương trình Java CLI là gì? –

+0

CLI - Giao diện dòng lệnh ... Tôi nghĩ vậy. – Joe