Testing keyboard events in controls

Roman Kennke roman at kennke.org
Wed Jan 4 04:10:53 PST 2012

Hi Jonathan,

Happy New Year to you and the whole JFX team!

Not having looked at your code yet, I am wondering if it would make
sense to add a (java.awt.)Robot-like class to JavaFX? Maybe the AWT
Robot can even be used directly? (after all, it generates OS level
events, I believe it doesn't matter if it's an AWT window, JavaFX window
or any other window).

A while ago I was thinking of building a FEST (for Swing) like testing
framework for JavaFX (for the ThingsFX project), and I'll certainly
start this once I have some time again. This should also be useful for
testing inside JavaFX itself.

Cheers, Roman

Am Mittwoch, den 04.01.2012, 16:03 +1000 schrieb Jonathan Giles:
> Hi all (and happy new year!),
> ListView/TreeView/TableView have a heap of keyboard requirements that 
> come in from UX. Keyboard event handling code is often fraught with 
> complexity due to the many permutations. I'm frequently getting burnt 
> due to subtle changes in this code causing unintended regressions.
> I finally decided to do something about this, and have thrown together a 
> very simple set of APIs to make it possible to write simple unit tests 
> that test keyboard navigation. It's all very lightweight so that it can 
> easily run as part of the JavaFX engineering continuous build (which 
> means it fails sooner, compared to SQE tests, or even worse - when it 
> ends up in the hands of developers!). Additionally, it's all very 
> primitive and proof-of-concept at this stage, and I am happy to refine 
> (and relocate) the class to provide utility in this area if it doesn't 
> duplicate existing functionality I'm unaware of. I'm also certain I'm 
> missing some of the details on how best to do this, so feedback is welcome.
> Anywho, you can find the class in the rt/javafx-ui-controls project, in 
> the test directory, in javafx.scene.control.KeyEventFirer. You can see a 
> few unit tests that were used to flesh out the API in 
> javafx.scene.control.ListViewKeyInputTest. I plan to add many more here, 
> and for other controls, in the coming weeks and months.
> These are the key pointers:
> 1) When creating a KeyEventFirer, you must provide an EventTarget. 
> Despite the scary name, all Nodes are EventTargets.
> 2) I put the ListView inside a group, which is placed in a scene, which 
> itself is placed in a stage. I show() and hide() the stage as necessary 
> (in the setup() / tearDown() methods). Without this, events don't fire.
> 3) I use the separate javafx.scene.control.KeyModifier class to provide 
> zero or more keyboard modifiers (shift, alt, ctrl, meta) to the keyboard 
> input. An enum might already exist for these modifiers, but I'm not sure...
> 4) I have convenience methods (for my needs, anyway) for 
> up/down/left/right keyboard inputs, in the form of 
> 'do*ArrowPress(KeyModifier... modifiers)' methods. I'm sure more can be 
> added...
> 5) For all other keyboard input, you can use the 'doKeyPress(KeyCode 
> keyCode, KeyModifier... modifiers)' method.
> Any feedback would be appreciated.

More information about the openjfx-dev mailing list