javaswingdesktop-applicationgui-builderjavafx-2

Adding JFXPanel to a JFrame. Why is it not working?


I am trying to add a JFXPanel to my JFrame. I am using Netbeans and Netbeans' Swing GUI Builder. When I run it I do not get any errors and the JFrame is created successfully but the JFXPanel with the text does not appear.

Here is my code:

public class TestingFX {

  private static void initJFrame() {

    NewJFrame frame = new NewJFrame();
    final JFXPanel fxPanel = new JFXPanel();
    frame.add(fxPanel);
    frame.setVisible(true);

    Platform.runLater(new Runnable() {

        @Override
        public void run() {
            fxPanel.setScene(createScene());
        }
    });
  }

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            initJFrame();
        }
    });
  }

  public static Scene createScene() {
    Text text = new Text("Hello World");
    text.setFont(new Font(24));
    text.setEffect(new Reflection());

    BorderPane pane = new BorderPane();
    pane.setCenter(text);
    Scene scene = new Scene(pane);

    return scene;
  }
}

Why is it not working? Am I doing something wrong?


Solution

  • Perhaps you should read Integrating JavaFX into Swing Applications, and then refactor your code accordingly.


    Try

    public class Demo extends Application{
        private static JFXPanel javafxPanel;
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    initAndShowGUI();
                }
            });
        }
    
        public static void initAndShowGUI() {
            JFrame frame = new JFrame("Swing application");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            // Create JavaFX panel.
            javafxPanel = new JFXPanel();
            frame.getContentPane().add(javafxPanel, BorderLayout.CENTER);
    
            // Create JavaFX scene.
            Application.launch (Demo.class, null);
    
            // Show frame.
            frame.pack();
            frame.setVisible(true);
        }
    
        @Override
        public void start (Stage mainStage) {
            // Add scene to panel
            javafxPanel.setScene(createScene());
        }
    
        private static Scene createScene() {
            Text text = new Text("Hello World");
            text.setFont(new Font(24));
            text.setEffect(new Reflection());
    
            BorderPane pane = new BorderPane();
            pane.setCenter(text);
            Scene scene = new Scene(pane);
    
            return scene;
        }
    }
    

    When creating a scene, this example assumes that the code you've included is valid.