2009-02-21 60 views
8

G'day tất cả,Phát hiện và tác động lên các phím hướng bàn phím trong Java

tôi có một dự án giao diện điều khiển, nơi nó được thiết kế người dùng nhấn các phím hướng bàn phím (không phải số bàn phím) để di chuyển một hình đại diện. Tôi gặp khó khăn khi viết mã để kiểm tra báo chí của các phím này. Trong Pascal, thật dễ dàng để sử dụng "readkey" và mã, ví dụ, cho # 80 cho việc nhấn phím xuống. Tuy nhiên, tôi stumped làm thế nào để thực hiện các chức năng tương tự trong Java, mặc dù tôi nghĩ rằng tôi hiểu việc sử dụng System.in và BufferedInputStream.

Có ai có thể giúp tôi không? Suy nghĩ hoặc gợi ý của bạn được đánh giá cao.

Trả lời

5

Vấn đề hỗ trợ Console trong Java rất nổi tiếng, tôi không chắc chắn rằng điều này có thể thực hiện được.

Điều này ban đầu không thể với System.in vì nó được sử dụng để làm việc dựa trên dòng.

Sun cuối cùng đã thêm một lớp java.io.Console.

Dưới đây là JavaDocs của nó: http://java.sun.com/javase/6/docs/api/java/io/Console.html

Một khi bạn có được giao diện điều khiển (tôi nghĩ từ System.Console), bạn có thể nhận được một người đọc và có lẽ đọc ký tự từ nó, nhưng tôi không chắc chắn nếu nó bao gồm phím.

Nói chung, bạn phải sử dụng Swing hoặc AWT nếu bạn muốn truy cập vào bàn phím, điều này thật ngớ ngẩn.

Tính đến năm 2007, đã có một yêu cầu tính năng về nó: here

+0

Cảm ơn rất nhiều. Tôi có thể trở lại Pascal sau đó, hoặc thử và thực hiện dự án của tôi trong Swing. – elwynn

+0

Tôi muốn giới thiệu Swing. – Eddie

+0

Đừng quay lại Pascal. Java có nhiều lợi ích. Các ứng dụng Console sử dụng giao diện điều khiển chủ yếu cho đầu ra và đầu vào dựa trên dòng, chúng không có nghĩa là tương tác đầy đủ, đó là một quang sai của DOS vẫn được hỗ trợ trong Pascal. – Uri

6

Đáng tiếc là điều này không thể một cách cầm tay:

http://forums.sun.com/thread.jspa?threadID=5351637&messageID=10526512

Trên Windows, đọc từ System.in sẽ chặn cho đến khi enter được nhấn, ngay cả khi bạn không sử dụng BufferedReader. Các mũi tên sẽ chu kỳ thông qua lịch sử lệnh. Thử nó cho mình:

import java.io.*; 
public class KeyTest { 
    public static void main(String[] argv) { 
    try { 
     InputStreamReader unbuffered = new InputStreamReader(System.in); 
     for (int i = 0; i < 10; ++i) { 
     int x = unbuffered.read(); 
     System.out.println(String.format("%08x", x)); 
     } 
    } catch (Exception e) { 
     System.err.println(e); 
    } 
    } 
} 

Cùng một vấn đề bằng cách sử dụng lớp Console (đầu vào đệm dưới Windows, phím mũi tên intepreted bởi Windows):

import java.io.*; 
public class KeyTest2 { 
    public static void main(String[] argv) { 
    try { 
     Console cons = System.console(); 
     if (cons != null) { 
     Reader unbuffered = cons.reader(); 
     for (int i = 0; i < 10; ++i) { 
      int x = unbuffered.read(); 
      System.out.println(String.format("%08x", x)); 
     } 
     } 
    } catch (Exception e) { 
     System.err.println(e); 
    } 
    } 
} 
4

Nếu java.io.console không làm việc cho bạn (Tôi chưa thử điều đó), hãy thử JLine. Tôi đã sử dụng nó để giải quyết một vaguely similar problem.

+0

JLine chắc chắn là con đường để đi, vẫn còn ngay bây giờ! – javanna

Các vấn đề liên quan