与Java中C的“ _getch()”是否等效?

Equivalent function to C's “_getch()” in Java?

我使用Google Wave,并且我想模拟在实际按下Enter键之前发送消息的功能。

是否有Java等效于C函数_getch()


我找到了一个代码,等效于C的" _getch()"函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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) {  
            }  
        }  
    }


您可以使用JLine库的ConsoleReader.readVirtualKey()方法。请参阅http://jline.sourceforge.net/apidocs/jline/ConsoleReader.html#readVirtualKey()。

如果您不想使用第3方库,并且在Mac OS X或UNIX上,则可以利用JLine能够读取单个字符的相同技巧:只需执行命令" stty -icanon min 1",然后再运行程序,然后System.in将不再行缓冲,并且可以使用System.in.read()获得单个字符。不幸的是,此技巧在Windows上不起作用,因此您需要使用本机库来提供帮助(或仅使用JLine)。


这可以解决问题,但我只能从命令行使用。不是来自IDE

1
2
3
4
5
6
7
8
 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()函数的定制方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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)
            {  
            }  
        }  
    }
}

Java中没有getch等效项。您也可以创建一个GUI组件并绑定keyEvent Listener。


最初,我想到了System.in.read(),但是您无需按Enter就可以获取输入。这需要本机控制台交互(每个系统的控制台都不相同)。

因此答案是"不,没有直接的类似物"。


您为什么不创建一个不在任何地方使用该程序的变量扫描仪。

pause0 = pause1.nextInt();

:l似乎容易得多...另外,您可以输入一条消息,说"按一下继续"。