Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.java.programmer > #39418
| From | Martin Gregorie <martin@mydomain.invalid> |
|---|---|
| Newsgroups | comp.lang.java.programmer |
| Subject | Re: How can I read individual keystrokes? |
| Date | 2020-04-05 11:22 +0000 |
| Organization | A noiseless patient Spider |
| Message-ID | <r6cf1b$h5k$1@dont-email.me> (permalink) |
| References | <r6b830$hra$1@dont-email.me> <r6beb1$1sef$1@gioia.aioe.org> |
On Sat, 04 Apr 2020 22:04:13 -0400, Arne Vajhøj wrote: > On 4/4/2020 8:17 PM, Martin Gregorie wrote: >> I have a need to read individual key presses as they are made. I'm >> developing this stuff under Linux with OpenJava 1.8 and would prefer a >> portable Java solution if that's possible. >> >> I have a working solution, but its ugly. A small C program captures the >> one or more characters emitted as a key is pressed and sends them >> individually to my Java application over a local network session. >> >> I've also tried using the Reader.read() method of the Reader instance >> returned by calling Console.reader() but that uses line buffering >> internally. As a result the Java code doesn't get sent anything until I >> hit RETURN, when all the characters typed since the last RETURN are >> sent, >> followed by the LF, so is of no use here. >> >> Also, there's a good chance that the C program is using OS-specific >> features to let it capture individual keystrokes. >> >> I have a feeling that I'm missing something obvious and so would >> appreciate it if any of you can point me in the direction of a pure >> Java way to capture individual key presses. > > For a Swing app then it is easy: KeyListener. > > For a console app it is a problem. > > Some of the common workarounds are: > * use JNI and some OS specific C code * use an existing library that > does the above (like jCurses) > * use an OS specific command (stty on Linux) to put console > in single character mode and use System.in.read() > Thanks, guys: it looks as though I didn't miss anything. I'm happy with using the C program as a keyboard listener knowing that there isn't a pure Java solution. The application is, in fact, yet another Curses implementation(!). I looked at jCurses before I wrote it and decided to see how far I could get without diving into JNI and friends. So, first I wrote a from-the- manual JTermcap implementation and then built my Curses implementation on that, using the O'Reilly "Programming with Curses" book and implementing all its functions as methods of my Curses class. Curses uses Cwindow and Jtermcap classes internally and reports errors by throwing CursesExceptions. The implementation follows the book closely enough to let it be used as its manual once its wrapped in a try...catch CursesException structure. This was/is intended to be the basis of a 4GL written in Java and based heavily on the Sculptor 4GL. Why? Because writing applications with Sculptor is very fast and easy and it wouldn't adapt easily to using Swing. I think writing a set of Java file i/o support classes and then using Coco/R to create a Sculptor->Java translator should be doable. Besides, years ago I wrote my own enhanced version of the Sculptor menu display program in C and using curses. That's still in daily use on my Linux systems and on the OS-9 emulator I use to run Sculptor programs. -- Martin | martin at Gregorie | gregorie dot org
Back to comp.lang.java.programmer | Previous | Next — Previous in thread | Find similar | Unroll thread
How can I read individual keystrokes? Martin Gregorie <martin@mydomain.invalid> - 2020-04-05 00:17 +0000
Re: How can I read individual keystrokes? Eric Sosman <esosman@comcast-dot-net.invalid> - 2020-04-04 20:38 -0400
Re: How can I read individual keystrokes? Arne Vajhøj <arne@vajhoej.dk> - 2020-04-04 22:04 -0400
Re: How can I read individual keystrokes? Martin Gregorie <martin@mydomain.invalid> - 2020-04-05 11:22 +0000
csiph-web