Java命令行中的键盘监听器

15

大多数展示 Swing 中 KeyEvent 的演示,命令行中的等效操作是什么?

4个回答

12

Swing和命令行环境不同,因为在控制台窗口中没有事件。标准GUI处理对象和事件。控制台没有这样的等效概念。

你拥有的是标准输入(以及标准输出),可以从中读取内容。请参见此问题,了解如何从控制台读取单个字符(而无需等待换行符) - 或者更确切地说,了解 Java 中很难实现此功能。

当然,你始终可以在单独的线程上异步读取文本。也就是说,主线程将持续做一些事情,侦听器线程将等待I/O阻塞调用。但是,这只能在应用程序级别上实现和处理。


6

您可以在循环中使用BufferedReader:

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

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

       //do something
   }

   in.close();

5
以下代码将防止Ctrl+C组合键停止CLI Java程序。
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);
      }
    });

什么是CLI Java程序? - Koray Tugay

5

KeyListener 只适用于 swing 类中。

如果要在命令行应用程序中实现相同的功能,可以使用 JNativeHook 库,该库使用 JNI 实现。这将允许您监听全局快捷键或鼠标移动,否则纯 Java 无法实现此功能。您也不需要使用 Swing 或其他 GUI 类。


1
“JNativeHook库”无法帮助您处理“Ctrl + C”键组合 - 程序通常会被终止。 - javauser71
1
请注意,根据此问题:https://github.com/kwhat/jnativehook/issues/162,JnativeHook需要X11才能工作(至少在2.1.0版本之前)。例如,我尝试在Docker容器中使用它,但无法正常工作。 - dkurzaj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接