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()); >> } >> } >> >>