I am trying to use JavaFx 2.x and Swing application by using a JInternalFrame in which attach a JFXPanel
My code below
public class InternalFrameWithJavafx extends javax.swing.JFrame {
/**
* Creates new form InternalFrameWithJavafx
*/
public InternalFrameWithJavafx() {
initComponents();
final JInternalFrame frame = new JInternalFrame();
frame.setTitle("test InternalFrame");
frame.setVisible(true);
frame.setResizable(true);
frame.setIconifiable(true);
frame.setMaximizable(true);
frame.setIconifiable(true);
frame.setClosable(true);
frame.setSize(800,600);
frame.setLocation(0, 0);
frame.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final JFXPanel javafxPanel = new JFXPanel();
BorderPane pane = new BorderPane();
javafxPanel.setScene( new Scene(pane) {
Text text = new Text("Hello World");
});
frame.getContentPane().add(javafxPanel, BorderLayout.CENTER);
}
});
this.add(frame);
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 300, Short.MAX_VALUE)
);
pack();
}// </editor-fold>
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (UnsupportedLookAndFeelException e) {
//handle exception
} catch (ClassNotFoundException e) {
//handle exception
} catch (InstantiationException e) {
//handle exception
} catch (IllegalAccessException e) {
//handle exception
}
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new InternalFrameWithJavafx().setVisible(true);
}
});
}
}
I have this 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(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(Unknown Source)
at javafx.scene.Scene.<init>(Unknown Source)
at javafx.scene.Scene.<init>(Unknown Source)
at javafxapplication2.InternalFrameWithJavafx$1$1.<init>(InternalFrameWithJavafx.java:47)
at javafxapplication2.InternalFrameWithJavafx$1.run(InternalFrameWithJavafx.java:47)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
For my purposes I must use a JInternalFrame: how can I solve this problem?
See the 'JavaFX in Swing' tutorial. You are performing JavaFX operations which should run on the JavaFX thread on the Swing thread (Event Dispatch Thread).
Luckily they learnt from their previous mistakes and now throw exceptions when you perform operations on the wrong thread. That is the exception you encountered.
Use the Platform#runLater
as shown in that tutorial
Platform.runLater(new Runnable() {
@Override
public void run() {
//javaFX operations should go here
}
});
The construction of the JFXPanel
can remain on the EDT (which is also illustrated in that tutorial)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With