Я использую Google Wave и хочу эмулировать возможность отправки сообщений до того, как вы действительно нажмете клавишу ввода.
Есть ли Java-эквивалент функции C _getch()
?
Я использую Google Wave и хочу эмулировать возможность отправки сообщений до того, как вы действительно нажмете клавишу ввода.
Есть ли Java-эквивалент функции C _getch()
?
Вы можете использовать метод 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).
Я нашел код, эквивалентный функции 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
- person aggregate1166877; 11.09.2012
synchronized
/wait()
, которые загромождают код? Простой System.out.println("Key pressed")
в правильном обратном вызове был бы намного лучше.
- person Matthieu; 05.04.2021
Сначала я подумал о 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 для функции 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)
{
}
}
}
}
почему бы вам просто не создать переменную Scanner, которая не использует ее, программу, нигде.
pause0 = pause1.nextInt();
:l это кажется намного проще... Кроме того, вы можете поместить сообщение "Нажмите, чтобы продолжить.";
_getch()
не является стандартным C. - person GManNickG   schedule 08.12.2009