2009-12-08 3 views

ответ

0

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

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

1

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

1

Вы можете использовать метод 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).

4

Я нашел код, эквивалентная функция для «_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) { 
      } 
     } 
    } 
+0

Поправьте меня, если я ошибаюсь, но не должны 'keyPressed',' keyReleased' и 'keyTyped' есть' @ Override' перед ними? Я не думаю, что это сработает иначе. Кроме того, отличный ответ. +1 – aggregate1166877

+4

@Override - это просто аннотация, метод переопределения по-прежнему отлично работает без него. Все это говорит компилятору, что метод * должен * переопределять какой-либо другой метод. – lynks

+2

Как эта функция эквивалентна _getch(), если она возвращает void? Не нужно ли возвращать персонажа? Поскольку он имеет переопределенное обозначение, нужно ли нам писать код, который его реализует, чтобы использовать его? – Joe

0

на заказ метод в 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) 
      { 
      } 
     } 
    } 
} 
-1

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

pause0 = pause1.nextInt();

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

0

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

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