Я использую Google Wave, и я хочу подражать способности отправлять сообщения, прежде чем на самом деле нажать клавишу ввода.Эквивалентная функция для "_getch()" в Java?
Существует ли Java-эквивалент функции C _getch()
?
Я использую Google Wave, и я хочу подражать способности отправлять сообщения, прежде чем на самом деле нажать клавишу ввода.Эквивалентная функция для "_getch()" в Java?
Существует ли Java-эквивалент функции C _getch()
?
Первоначально я думал о System.in.read(), но вам нужно получить ввод без нажатия Enter. Для этого требуется встроенное взаимодействие с консолью (и в каждой системе консоль различна).
Так что ответ «нет, прямого аналога нет».
В java нет эквивалента getch. Вы также можете создать компонент GUI и связать прослушиватель keyEvent.
Вы можете использовать метод 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).
Я нашел код, эквивалентная функция для «_getch C (в)
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 – aggregate1166877
@Override - это просто аннотация, метод переопределения по-прежнему отлично работает без него. Все это говорит компилятору, что метод * должен * переопределять какой-либо другой метод. – lynks
Как эта функция эквивалентна _getch(), если она возвращает void? Не нужно ли возвращать персонажа? Поскольку он имеет переопределенное обозначение, нужно ли нам писать код, который его реализует, чтобы использовать его? – Joe
на заказ метод в Java для Геч() функции из 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)
{
}
}
}
}
Почему бы вам просто не создать переменный сканер, который не использует его, программу в любом месте.
pause0 = pause1.nextInt();
: l кажется намного более легким ... Кроме того, вы можете написать сообщение «Нажмите, чтобы продолжить»;
Это сделает трюк, но я работаю только из командной строки. Не из IDE
Console c =System.console();
Reader r = c.reader();
try {
num= r.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
'_getch()' не является стандартной C. – GManNickG