【问题标题】:In Java, what is the best way to capture a <tab> keystroke?在 Java 中,捕获 <tab> 击键的最佳方法是什么?
【发布时间】:2011-01-05 20:27:43
【问题描述】:

我无法在我的 Java 命令行应用程序中捕获 键击。使用 System.in.read() 在按 Tab 键时我似乎什么也没得到。解决这个问题的最佳方法是什么?

为了提供一些上下文,我试图让用户在命令中按 Tab 键以使其自动完成命令(就像您在 bash shell 中所做的那样)。如果有更好的方法来实现这一点,我愿意接受建议(也许使用 System.in.read() 不是解决这个问题的最佳角度?)。

【问题讨论】:

  • 请参阅stackoverflow.com/questions/1066318,了解在“原始模式”下读取单个字符的讨论。正如 Paul 和 Michael 所指出的,这将需要一个依赖于平台的解决方案。

标签: java keystrokes


【解决方案1】:

看看JLine。我自己没用过。它使用 Windows DLL(使用 JNI),并且支持 linux 将控制台切换到字符/原始模式而不是缓冲模式。我以前从未使用过这个,所以使用风险自负。我也不是 100% 确定它是否会解决您的问题,但值得一试:)

编辑:我可以确认它确实有效

ConsoleReader cr = new ConsoleReader();
while (cr.readVirtualKey() != 0x09){
  //loop till Tab is pressed
}

再次编辑:该库确实包含命令行的自动完成功能(通过按 Tab 键)...享受 :)

【讨论】:

    【解决方案2】:

    我猜你的 shell 正在捕获选项卡并阻止它进入你的应用程序。对此您可能无能为力...

    【讨论】:

      【解决方案3】:

      来自 InputStream 的数据仅在用户按下回车后才可用。我想你会发现,如果你在 tab 之后按 enter,tab 就会出现。

      在 c 应用程序中,也有类似的情况:shell 将输入模式设置为从熟到生,因为它需要原始击键。 Readline 是 Linux 中用于此目的的普通库。我不确定在 Windows 上什么是常见的。据我所知,使用 JNI 的东西是这里唯一的选择。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-13
        • 1970-01-01
        • 2012-10-10
        • 2010-09-10
        • 2019-08-20
        • 1970-01-01
        相关资源
        最近更新 更多