Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.java.programmer > #39415 > unrolled thread
| Started by | Martin Gregorie <martin@mydomain.invalid> |
|---|---|
| First post | 2020-04-05 00:17 +0000 |
| Last post | 2020-04-05 11:22 +0000 |
| Articles | 4 — 3 participants |
Back to article view | Back to comp.lang.java.programmer
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
| From | Martin Gregorie <martin@mydomain.invalid> |
|---|---|
| Date | 2020-04-05 00:17 +0000 |
| Subject | How can I read individual keystrokes? |
| Message-ID | <r6b830$hra$1@dont-email.me> |
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. -- Martin | martin at Gregorie | gregorie dot org
[toc] | [next] | [standalone]
| From | Eric Sosman <esosman@comcast-dot-net.invalid> |
|---|---|
| Date | 2020-04-04 20:38 -0400 |
| Message-ID | <r6b9b2$tkv$1@dont-email.me> |
| In reply to | #39415 |
On 4/4/2020 8:17 PM, Martin Gregorie wrote:
> I have a need to read individual key presses as they are made. [...]
> 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.
In a Swing setting this should be straightforward ("should be" --
hah!) even if somewhat verbose. For a "console" app I'm not so sure,
and for JavaFX I've no clue at all.
Can you offer any details of your application?
--
esosman@comcast-dot-net.invalid
Trump wants to star as The Lyin' King.
Two hundred ninety-one days to go.
[toc] | [prev] | [next] | [standalone]
| From | Arne Vajhøj <arne@vajhoej.dk> |
|---|---|
| Date | 2020-04-04 22:04 -0400 |
| Message-ID | <r6beb1$1sef$1@gioia.aioe.org> |
| In reply to | #39415 |
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() Arne
[toc] | [prev] | [next] | [standalone]
| From | Martin Gregorie <martin@mydomain.invalid> |
|---|---|
| Date | 2020-04-05 11:22 +0000 |
| Message-ID | <r6cf1b$h5k$1@dont-email.me> |
| In reply to | #39417 |
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
[toc] | [prev] | [standalone]
Back to top | Article view | comp.lang.java.programmer
csiph-web