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.rushfo...@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




Reply via email to