Stage hide/show from Swing
Kevin Rushforth
kevin.rushforth at oracle.com
Tue May 19 14:59:53 UTC 2015
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