import java.awt.BorderLayout;
import java.awt.Dimension;

import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class SimpleJFXPanel {

    // Flag to control whether the scene is set on the JFXPanel
    // on the FX thread (true) or Swing thread (false).
    // Set to false to reproduce the bug
    static final boolean SET_SCENE_ON_FX_THREAD = false;

    public SimpleJFXPanel() {
        final JFrame frame = new JFrame("Simple JFXPanel");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());

        JPanel swingPanel = new JPanel();
        JLabel swingLabel1 = new JLabel("This is a Swing JLabel");
        JLabel swingLabel2 = new JLabel("A JavaFX label should be drawn in the center of the JFrame");
        swingPanel.setLayout(new BoxLayout(swingPanel, BoxLayout.Y_AXIS));
        swingPanel.add(swingLabel1);
        swingPanel.add(swingLabel2);
        frame.add(swingPanel, BorderLayout.NORTH);

        // Create javafx panel
        final JFXPanel fxPanel = new JFXPanel();
        fxPanel.setPreferredSize(new Dimension(550,400));
        frame.add(fxPanel, BorderLayout.CENTER);

        // create JavaFX scene
        createScene(fxPanel);

        // show frame
        frame.pack();
        frame.setVisible(true);
    }

    private void createScene(final JFXPanel fxPanel) {
        System.err.println("createScene: calling Platform.runLater");
        Platform.runLater(new Runnable() {
            public void run() {
                System.err.println("Create scene");
                StackPane root = new StackPane();

                Label label = new Label("This is a JavaFX Label");

                root.getChildren().add(label);

                final Scene scene = new Scene(root);

                // Add scene to JFXPanel
                if (SET_SCENE_ON_FX_THREAD) {
                    fxPanel.setScene(scene);
                } else {
                    SwingUtilities.invokeLater(() -> {
                        System.err.println("Setting the scene on the EDT");
                        fxPanel.setScene(scene);
                        System.err.println("KCR: Done");
                    });
                }
            }
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new SimpleJFXPanel());
    }
}
