enterNestedEventLoop as public API?
John Hendrikx
hjohn at xs4all.nl
Wed Nov 13 08:35:12 PST 2013
On 13/11/2013 16:35, Stephen F Northover wrote:
> What is the difference?
>
> Dialog d = new Dialog() {
> public void onClose() {
> Platform.exitNestedEventLoop();
> }
> }
> Platform.enterNestedEventLoop();
I find the current API to work well, it is just in the wrong package tree :)
Considering I didn't know about nested event loops before, I find the
solution quite elegant -- leave the old event loop on the call stack,
and start a fresh one that can be exited to continue again where the
main event loop was halted -- it's almost like a 2nd thread gets
started, but there isn't :)
--John
>
> Steve
>
> On 2013-11-13 5:28 AM, Tom Schindl wrote:
>> What bothers me with the API as it is today is that I have call
>> enter/exit, I would find it more easy to work with an API like:
>>
>> -------8<-------
>> WaitCondition c = new WaitCondition();
>> Dialog d = new Dialog() {
>> public void onClose() {
>> c.release();
>> }
>> }
>> Platform.spinNestedEventLoop(c);
>> ------->8-------
>>
>> Tom
>>
>> On 13.11.13 11:18, Artem Ananiev wrote:
>>> I also think it's a good request for public API. In AWT/Swing, people
>>> had been using ugly workarounds with modal dialogs just to enter a
>>> nested event loop, until public java.awt API was finally provided:
>>>
>>> http://docs.oracle.com/javase/7/docs/api/java/awt/SecondaryLoop.html
>>>
>>> http://docs.oracle.com/javase/7/docs/api/java/awt/EventQueue.html#createSecondaryLoop()
>>>
>>>
>>>
>>> The same is here in JavaFX: unless Toolkit.enter/exitNestedEventLoop()
>>> is exposed at javafx.* level, people will have to workaround it by
>>> using
>>> Stage, or calling into com.sun.javafx.*, which is not good.
>>>
>>> Thanks,
>>>
>>> Artem
>>>
>>> On 11/13/2013 10:15 AM, John Hendrikx wrote:
>>>> Hi List,
>>>>
>>>> Any chance that Toolkit.getToolkit().enterNestedEventLoop() will in
>>>> the
>>>> future become public API?
>>>>
>>>> I'm currently using this to create Dialogs based on a Pane to avoid
>>>> creating Stages (which have the nice show and showAndWait
>>>> functionality). I duplicated this functionality in a Pane,
>>>> allowing me
>>>> to create Dialogs on top of existing Scenes without creating a Stage,
>>>> and it makes use of the enterNestedEventLoop and exitNestedEventLoop
>>>> functions in com.sun.javafx.tk.Toolkit.
>>>>
>>>> The reason I'm avoiding the Stages is because they donot play well
>>>> with
>>>> an application that never has the mouse or keyboard focus (my
>>>> application is fully remote controlled) -- creating a Stage, even
>>>> one to
>>>> just show a Dialog, will cause Windows to try and attract the user's
>>>> attention by flashing its taskbar button (for which I filed a
>>>> bug/feature request) and this is undesired.
>>>>
>>>> Regards,
>>>> John
>>>>
>>>> (Here's a part of the DialogPane to show and close it:)
>>>>
>>>> public R showDialog(Scene scene, boolean synchronous) {
>>>> this.synchronous = synchronous;
>>>> this.scene = scene;
>>>> this.oldFocusOwner = scene.getFocusOwner();
>>>>
>>>> Parent root = scene.getRoot();
>>>>
>>>> stackPane.getChildren().add(root);
>>>> stackPane.getChildren().add(this);
>>>>
>>>> scene.setRoot(stackPane);
>>>>
>>>> requestFocus();
>>>>
>>>> if(synchronous) {
>>>> return (R)Toolkit.getToolkit().enterNestedEventLoop(this);
>>>> }
>>>>
>>>> return null;
>>>> }
>>>>
>>>> public void close() {
>>>> Parent originalRoot = (Parent)stackPane.getChildren().remove(0);
>>>>
>>>> scene.setRoot(originalRoot);
>>>> scene = null;
>>>>
>>>> if(oldFocusOwner != null) {
>>>> oldFocusOwner.requestFocus();
>>>> }
>>>>
>>>> if(synchronous) {
>>>> Toolkit.getToolkit().exitNestedEventLoop(this, getResult());
>>>> }
>>>> }
>>>>
>>>>
>
More information about the openjfx-dev
mailing list