【问题标题】:Equivalent function to C's "_getch()" in Java?Java中C的“_getch()”的等效函数?
【发布时间】:2009-12-08 01:42:41
【问题描述】:

我使用 Google Wave,我想模拟在您实际按下回车键之前发送消息的能力。

是否有与 C 函数 _getch() 等效的 Java?

【问题讨论】:

  • _getch() 不是标准 C。

标签: java c getch


【解决方案1】:

您可以使用 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)。

【讨论】:

    【解决方案2】:

    我找到了一个代码,相当于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
    • @Override 只是一个注释,没有它,方法覆盖仍然可以正常工作。它所做的只是告诉编译器该方法应该覆盖其他方法。
    • 如果这个函数返回 void,它如何等同于 C 的 _getch()?它不需要返回一个字符吗?既然它有覆盖符号,我们是否需要编写实现它的代码才能使用它?
    • 你能放弃那些让代码混乱的无用的synchronized/wait()吗?在适当的回调中使用简单的System.out.println("Key pressed") 会好很多。
    【解决方案3】:

    最初我想到了 System.in.read(),但是你需要在不按 Enter 的情况下获取输入。这需要本地控制台交互(并且每个系统下的控制台都不同)。

    所以答案是“不,没有直接的类比”。

    【讨论】:

      【解决方案4】:

      在 java 中没有 getch 等价物。你不妨创建一个 GUI 组件并绑定 keyEvent 监听器。

      【讨论】:

        【解决方案5】:

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

         Console c =System.console();
        Reader r = c.reader();
        try {
            num=    r.read();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        

        【讨论】:

        • 在 Windows 7 系统上尝试此操作会阻塞,直到输入“\n”。
        【解决方案6】:

        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)
                    {  
                    }  
                }  
            }
        }
        

        【讨论】:

        • 这是another answer 的复制粘贴,甚至都不好,一年多了。
        【解决方案7】:

        你为什么不直接创建一个不使用它的变量 Scanner,程序,在任何地方。

        pause0 = pause1.nextInt();

        :l 这似乎容易多了...另外,您可以输入一条消息说“按继续。”;

        【讨论】:

          猜你喜欢
          • 2011-08-28
          • 1970-01-01
          • 1970-01-01
          • 2011-11-02
          • 1970-01-01
          • 2021-09-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多