Эквивалентная функция C "_getch()" в Java?

Я использую Google Wave и хочу эмулировать возможность отправлять сообщения до того, как вы действительно нажмете клавишу ввода.

Есть ли Java-эквивалент функции C _getch()?

7 ответов

Вы можете использовать метод ConsoleReader.readVirtualKey() библиотеки JLine. См. http://jline.sourceforge.net/apidocs/jline/ConsoleReader.html.

Если вы не хотите использовать стороннюю библиотеку и используете Mac OS X или UNIX, вы можете просто воспользоваться тем же приемом, который использует JLine для чтения отдельных символов: просто выполните команду "stty -icanon min 1"перед запуском вашей программы, а затем System.in больше не будет буферизоваться строкой, и вы можете получить отдельный символ с помощью System.in.read(). К сожалению, этот трюк не работает в Windows, поэтому вам нужно использовать нативную библиотеку, чтобы помочь (или просто использовать JLine).

Я нашел код, эквивалентный функции С в "_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) {  
            }  
        }  
    }

В Java нет эквивалента getch. Вы также можете создать компонент с графическим интерфейсом и связать KeyEvent Listener.

Первоначально я думал о System.in.read(), но вам нужно получить ввод без нажатия Enter. Это требует взаимодействия с собственной консолью (и консоль отличается в каждой системе).

Так что ответ "нет, прямого аналога нет".

Это сделает свое дело, но я работаю только из командной строки. Не из IDE

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

Почему бы вам просто не создать переменную Scanner, которая не использует его, программу, где угодно.

pause0 = pause1.nextInt ();

: l кажется, это намного проще... Плюс вы можете поместить сообщение, говорящее "Нажмите, чтобы продолжить.";

Пользовательский метод в Java для функции getch() C



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)
            {  
            }  
        }  
    }
}
Другие вопросы по тегам