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 javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;

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

public class JFXPanelHiDPI {

    public JFXPanelHiDPI() {
        final JFrame frame = new JFrame("JFXPanel with Label");
        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 is drawn on top of a yellow rectangle 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();

                Rectangle rect = new Rectangle(400, 50);
                rect.setFill(Color.YELLOW);
                Label label = new Label("This is a JavaFX Label");
                label.setStyle("-fx-font-size: 24");

                root.getChildren().addAll(rect, label);

                final Scene scene = new Scene(root);

                // Add scene to JFXPanel
                fxPanel.setScene(scene);
            }
        });
    }

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