Stage hide/show from Swing

Matthias Hänel haenel at ultramixer.com
Tue May 26 09:21:43 UTC 2015


Thanks Kevin, I did it like that :)


Matthias


> Am 19.05.2015 um 16:59 schrieb Kevin Rushforth <kevin.rushforth at oracle.com>:
> 
> Actually, I was saying that you should call Platform.setImplicitExit(false). This is good practice for Swing interop applications, and is absolutely needed in your case. l Note that this is attribute state so you only need to do it once at the beginning of your application.
> 
> My other point is that you should not use the internal PlatformImpl class at all. It is not supported now, and will stop working in JDK 9. What you should do instead is this:
> 
>     Platform.setImplicitExit(false);
>     new JFXPanel();
>     Platform.runLater(() -> {
>         // your code goes here....
>     });
> 
> You don't actually need to do anything with the JFXPanel unless you want to use it to display a JavaFX scene in a Swing component.
> 
> -- Kevin
> 
> 
> Matthias Hänel wrote:
>> Hey Tom and Kevin,
>> 
>> 
>> thanks for you answers.
>> 
>> 
>> I see setImplicitExit should be avoided but I don't get it working without.
>> 
>> I have now a running version with follwing code:
>> 
>> 
>> public void show()
>> {
>>     Platform.setImplicitExit(false);
>>     if( invisibleJFXPanel==null )
>>     {
>>         PlatformImpl.startup(new Runnable()
>>         {
>>             @Override
>>             public void run()
>>             {
>>                 invisibleJFXPanel = new JFXPanel();
>>                 invisibleJFXPanel.setSize(100,100);
>>                 invisibleJFXPanel.setVisible(true); // this should be invisible in the future
>>             }
>>         });
>>     }
>>     
>>     PlatformImpl.runLater(new Runnable()
>>     {
>>         @Override
>>         public void run()
>>         {
>>             myStage = new MyStage();
>>             myStage();
>>         }
>>     });
>> }
>> 
>> public void hide()
>> {
>>     Platform.setImplicitExit(false);
>>     if (myStage != null)
>>     {
>>         Platform.runLater(new Runnable()
>>         {
>>             @Override
>>             public void run()
>>             {
>>                 myStage.hide();
>>             }
>>         });
>>     }
>> }
>> 
>> 
>> When I understand Kevin correctly, this code should work without any call to Platform.setImplicitExit(false);
>> Unfortunately, it does not.
>> 
>> 
>> regards
>> Matthias
>> 
>> 
>> 
>>   
>> 
>>> Am 18.05.2015 um 17:24 schrieb Kevin Rushforth <kevin.rushforth at oracle.com>
>>> :
>>> 
>>> 
>>> You should call Platform.setImplicitExit(false) to disable the default behavior where the FX toolkit exits when the last Stage is closed.
>>> 
>>> One more suggestion:
>>> 
>>>     
>>> 
>>>> PlatformImpl.startup(new Runnable()
>>>>       
>>>> 
>>> This is not public API and should be avoided. If you are running a Swing application and want to startup the FX toolkit, you should create a new instance of JFXPanel (even if you don't use it).
>>> 
>>> 
>>> -- Kevin
>>> 
>>> 
>>> 
>>> 
>>> Matthias Hänel wrote:
>>>     
>>> 
>>>> Hello there,
>>>> 
>>>> 
>>>> I have a stage that is been called from a Java Swing application. This is not a real problem
>>>> since I can run follwing code:
>>>> 
>>>> PlatformImpl.startup(new Runnable()
>>>> {
>>>>    @Override
>>>>    public void run()
>>>>    {
>>>>        myStage = new myStage();
>>>>        myStage.show();
>>>>    }
>>>> });
>>>> 
>>>> 
>>>> That works so far. 
>>>> No I would like to close this stage from the swing application. I can call:
>>>> 
>>>> Platform.runLater(new Runnable()
>>>> {
>>>>    @Override
>>>>    public void run()
>>>>    {
>>>>        myStage.hide();
>>>>    }
>>>> });
>>>> 
>>>> 
>>>> This also works. 
>>>> Since I have a toggle-Button to hide and show the stage from the swing application, I would like
>>>> to re-show the stage and I would like to know when the stage is showing or not. This seems to be nearly impossible by now.
>>>> 
>>>> What did I try?
>>>> 
>>>> 1. I tried to shutdown the javafx entire with com.sun.javafx.tk.Toolkit.getToolkit().exit(); in the hide process. So I expected to use PlatformImpl.startup again. Unfortunately, it did not work.
>>>> 
>>>> 2. I tried to leave javafx untouched. The second time I only call PlatformImpl.runLater to create a new scene.
>>>> 
>>>> 3. I tried to run it from the swing thread without Platform.run... ... this failed obviuosly. (I just had no further ideas ;)) 
>>>> 
>>>> Does anyone tried this before? Any advise will be helpful :)
>>>> 
>>>> 
>>>> 
>>>> Thanks in advance
>>>> Matthias
>>>> 
>>>> 
>>>> 
>>>>  
>>>>       
>>>> 
>> 
>>   
>> 



More information about the openjfx-dev mailing list