Эквивалентная функция 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)
{
}
}
}
}