【发布时间】:2009-12-08 01:42:41
【问题描述】:
我使用 Google Wave,我想模拟在您实际按下回车键之前发送消息的能力。
是否有与 C 函数 _getch() 等效的 Java?
【问题讨论】:
-
_getch()不是标准 C。
我使用 Google Wave,我想模拟在您实际按下回车键之前发送消息的能力。
是否有与 C 函数 _getch() 等效的 Java?
【问题讨论】:
_getch() 不是标准 C。
您可以使用 JLine 库的 ConsoleReader.readVirtualKey() 方法。见http://jline.sourceforge.net/apidocs/jline/ConsoleReader.html#readVirtualKey()。
如果您不想使用 3rd 方库,并且使用的是 Mac OS X 或 UNIX,则可以利用 JLine 用来读取单个字符的相同技巧:只需执行在运行程序之前命令“stty -icanon min 1”,然后 System.in 将不再被行缓冲,您可以使用 System.in.read() 获取单个字符。不幸的是,这个技巧在 Windows 上不起作用,所以你需要使用本地库来帮助(或者只使用 JLine)。
【讨论】:
我找到了一个代码,相当于C的“_getch()”函数
public static void getCh() {
final JFrame frame = new JFrame();
synchronized (frame) {
frame.setUndecorated(true);
frame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
frame.addKeyListener(new KeyListener() {
@Override
public void keyPressed(KeyEvent e) {
synchronized (frame) {
frame.setVisible(false);
frame.dispose();
frame.notify();
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
});
frame.setVisible(true);
try {
frame.wait();
} catch (InterruptedException e1) {
}
}
}
【讨论】:
keyPressed、keyReleased 和keyTyped 不应该在他们前面有@Override 吗?我不认为它会起作用。除此之外,很好的答案。 +1
synchronized/wait()吗?在适当的回调中使用简单的System.out.println("Key pressed") 会好很多。
最初我想到了 System.in.read(),但是你需要在不按 Enter 的情况下获取输入。这需要本地控制台交互(并且每个系统下的控制台都不同)。
所以答案是“不,没有直接的类比”。
【讨论】:
在 java 中没有 getch 等价物。你不妨创建一个 GUI 组件并绑定 keyEvent 监听器。
【讨论】:
这可以解决问题,但我只能从命令行工作。不是来自 IDE
Console c =System.console();
Reader r = c.reader();
try {
num= r.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
【讨论】:
Java中为C的getch()函数定制的方法
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.*;
class getch
{
public static void getCh()
{
final JFrame frame = new JFrame();
synchronized(frame)
{
frame.setUndecorated(true);
frame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
frame.addKeyListener(new KeyListener()
{
public void keyPressed(KeyEvent e)
{
synchronized(frame)
{
frame.setVisible(false);
frame.dispose();
frame.notify();
}
}
public void keyReleased(KeyEvent e)
{
}
public void keyTyped(KeyEvent e)
{
}
});
frame.setVisible(true);
try
{
frame.wait();
}
catch(InterruptedException e1)
{
}
}
}
}
【讨论】:
你为什么不直接创建一个不使用它的变量 Scanner,程序,在任何地方。
pause0 = pause1.nextInt();
:l 这似乎容易多了...另外,您可以输入一条消息说“按继续。”;
【讨论】: