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

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

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


person Pandemic21    schedule 08.12.2009    source источник
comment
_getch() не является стандартным C.   -  person GManNickG    schedule 08.12.2009


Ответы (7)


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

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

person marcprux    schedule 10.12.2009

Я нашел код, эквивалентный функции 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) {  
            }  
        }  
    }
person Nagaraju Badaeni    schedule 12.04.2012
comment
Поправьте меня, если я ошибаюсь, но разве перед keyPressed, keyReleased и keyTyped не должно стоять @Override? Я не думаю, что иначе это сработает. Кроме того, отличный ответ. +1 - person aggregate1166877; 11.09.2012
comment
@Override — это просто аннотация, переопределение метода прекрасно работает и без нее. Все, что он делает, это говорит компилятору, что метод должен переопределять какой-то другой метод. - person lynks; 08.11.2012
comment
Как эта функция эквивалентна _getch() C, если она возвращает void? Разве не нужно возвращать символ? Поскольку у него есть переопределяющая нотация, нужно ли нам писать код, который его реализует, чтобы использовать его? - person Joe; 16.09.2015
comment
Не могли бы вы убрать бесполезные synchronized/wait(), которые загромождают код? Простой System.out.println("Key pressed") в правильном обратном вызове был бы намного лучше. - person Matthieu; 05.04.2021

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

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

person Vladimir Dyuzhev    schedule 08.12.2009

В java нет эквивалента getch. Вы также можете создать компонент GUI и привязать прослушиватель keyEvent.

person tensaix2j    schedule 08.12.2009

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

 Console c =System.console();
Reader r = c.reader();
try {
    num=    r.read();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
person harsha kumar Reddy    schedule 15.11.2017
comment
Попытка этого в системе Windows 7 блокируется до тех пор, пока не будет введено «\n». - person trindflo; 20.02.2019

Специальный метод на 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)
            {  
            }  
        }  
    }
}
person Souradeep Panda    schedule 02.10.2013
comment
Это копипастер другого ответа, который даже не очень хорош, и более года спустя. - person Matthieu; 05.04.2021

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

pause0 = pause1.nextInt();

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

person Jose Pablo    schedule 21.03.2017