Funzione equivalente a C “_getch ()” in Java?

Uso Google Wave e desidero emulare la possibilità di inviare messaggi prima che tu abbia effettivamente premuto il tasto Invio.

Esiste un equivalente Java alla funzione C _getch() ?

Ho trovato un codice, funzione equivalente a 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) { } } } 

Non esiste un equivalente getch in java. Si potrebbe anche creare un componente GUI e associare il listener keyEvent.

È ansible utilizzare il metodo ConsoleReader.readVirtualKey () della libreria JLine. Vedi http://jline.sourceforge.net/apidocs/jline/ConsoleReader.html#readVirtualKey () .

Se non vuoi utilizzare una libreria di terze parti e se utilizzi Mac OS X o UNIX, puoi semplicemente sfruttare lo stesso trucco utilizzato da JLine per leggere i singoli caratteri: basta eseguire il comando “stty -icanon min 1 “prima di eseguire il programma, quindi System.in non sarà più in modalità buffer di riga e sarà ansible ottenere un singolo carattere utilizzando System.in.read (). Sfortunatamente, questo trucco non funziona su Windows, quindi è necessario utilizzare una libreria nativa per aiutare (o semplicemente usare JLine).

Inizialmente pensavo a System.in.read (), ma è necessario ottenere input senza premere Invio. Ciò richiede l’interazione con la console nativa (e la console è diversa sotto ogni sistema).

Quindi la risposta è “no, non esiste un analogo diretto”.

Metodo su misura in Java per la funzione getch () di 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) { } } } } 

Questo farà il trucco, ma io lavoro solo dalla riga di comando. Non da IDE

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

perché non crei uno scanner variabile che non lo usi, il programma, ovunque.

pause0 = pause1.nextInt ();

: Mi sembra molto più facile … In più puoi mettere un messaggio che dice “Premi per continuare.”;