-1

I am creating and application in JavaSwing but later on switched to JavaFX and Added all the modules and other swing frame in JavaFX Maven Project all component of swing is working but I want to Integrate one FX Frame in Java Swing. The Scenario is such that on button click of swing form I want to open the FXForm. I refered to all the material here at stackoverflow but non of them is working out for me.

 private void btnViewActionPerformed(java.awt.event.ActionEvent evt) {                                        


        JFrame window = new JFrame();
        SwingUtilities.invokeLater(() -> {
        JFXPanel fXPanel = new JFXPanel();
        Platform.setImplicitExit(false);
        Platform.runLater(() -> {
            try {
                FXMLLoader loader = new 
                FXMLLoader(getClass().getResource("/fxml/ViewScreen.fxml"));
                Parent root = loader.load();
                Scene scene = new Scene(root);
                scene.getStylesheets().add("/styles/Styles.css");
                fXPanel.setScene(scene);
                FXMLController controller = loader.getController();
                controller.initLiveUpdate(mm);
                window.add(fXPanel);
                window.setVisible(true);
                window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                Platform.setImplicitExit(false);
            } catch (IOException ex) {
                Logger.getLogger(ScoreEntry1.class.getName()).log(Level.SEVERE, null, ex);
            }
        });





        }        

And Below Is the Exception

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Not on FX application thread; currentThread = AWT-EventQueue-0
    at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:236)
    at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:423)
    at javafx.stage.Stage.<init>(Stage.java:241)
    at javafx.stage.Stage.<init>(Stage.java:227)
    at com.margosa.frame.ScoreEntry.btnViewActionPerformed(ScoreEntry.java:1121)
    at com.margosa.frame.ScoreEntry.access$1300(ScoreEntry.java:50)
    at com.margosa.frame.ScoreEntry$15.actionPerformed(ScoreEntry.java:792)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6533)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at java.awt.Component.processEvent(Component.java:6298)
    at java.awt.Container.processEvent(Container.java:2236)
    at java.awt.Component.dispatchEventImpl(Component.java:4889)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
    at java.awt.Container.dispatchEventImpl(Container.java:2280)
    at java.awt.Window.dispatchEventImpl(Window.java:2746)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

I have already tried below link and not working out for me 1) How to avoid Not on FX application thread; currentThread = JavaFX Application Thread error?

  • Yes you have told me sorry – Divyang Mistry Feb 18 '18 at 11:58
  • Ok can you help me out with the above scenario – Divyang Mistry Feb 18 '18 at 12:03
  • I already tried it and its in my code – Divyang Mistry Feb 18 '18 at 12:22
  • You dont see it that its not working – Divyang Mistry Feb 18 '18 at 12:22
  • Much better now - but just remember: don't expect others to A) read your code to then B) check out for other existing answers to then C) derive what you have read/tried before. – GhostCat Feb 18 '18 at 12:35
  • And you want to point out which which lines in your score entry class are listed in that exception trace. That definitely matters. And, **guessing here** - it looks strange that you do use Swing invoke later inside another fx later block. – GhostCat Feb 18 '18 at 12:37
  • The Line which are listed in stack trace are below which are point out are FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/ViewScreen.fxml")); and the line Parent root = loader.load(); Scene scene = new Scene(root); – Divyang Mistry Feb 18 '18 at 12:45
  • Not in comments, update the question please. And consider deleting no longer required comments, too ;-) – GhostCat Feb 18 '18 at 12:48
  • Ok wait I will chage it – Divyang Mistry Feb 18 '18 at 12:53
  • I have changed it please check it out – Divyang Mistry Feb 18 '18 at 13:03
  • The line you say the stack trace is referencing is not actually the line that's referenced. You have `at com.margosa.frame.ScoreEntry.btnViewActionPerformed(ScoreEntry.java:1121)`, which must be a call to `new Stage()`, because the next line up in the stack trace is the `Stage` constructor. You haven't even posted a call to `new Stage()` in the question: so as your question stands it is unanswerable. – James_D Feb 18 '18 at 17:11
  • I have read and refered it and suggested code tell me that you don't need stage when you need to execute it in the swing so I have written it in code – Divyang Mistry Feb 19 '18 at 14:25

2 Answers2

2
private void btnViewActionPerformed(java.awt.event.ActionEvent evt) { 
     SwingUtilities.invokeLater(() -> {
            initAndShowGUI();
    });
}
public void initAndShowGUI() {
    // This method is invoked on the EDT thread
    JFrame frame = new JFrame("Swing and JavaFX");
    final JFXPanel fxPanel = new JFXPanel();
    frame.add(fxPanel);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Platform.runLater(() -> {
        initFX(fxPanel);
    });
}

private void initFX(JFXPanel fxPanel) {
    // This method is invoked on the JavaFX thread
    Scene scene = createScene();
    fxPanel.setScene(scene);
}

private Scene createScene() {
    try {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/ViewScreen.fxml"));
        Parent root = loader.load();
        Scene scene = new Scene(root, Color.ALICEBLUE);
        Stage stage = new Stage();
        stage.setScene(scene);
        return (scene);

    } catch (IOException ex) {
        Logger.getLogger(LoginForm.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}
0

I think you somewhat messed up the parts which should be run by Platform.runLater() and SwingUtilities.invokeLater().

In this simple example , the invokeLater() initializes the JFXPanel() which later calls Platform.runLater(), which then does all the javafx stuff.

May try to change what happens in which method and try it out.

DerDingens
  • 317
  • 4
  • 10