JavaFx 2.x – Swing:不在FX应用程序线程上

我试图通过使用附加JFXPanel的JInternalFrame来使用JavaFx 2.x和Swing应用程序

我的代码如下

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") //  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(); }//  /** * @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); } }); } } 

我有这个例外

 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.(Unknown Source) at javafx.scene.Scene.(Unknown Source) at javafxapplication2.InternalFrameWithJavafx$1$1.(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) 

为了我的目的,我必须使用JInternalFrame:我该如何解决这个问题?

请参阅“Swing中的JavaFX”教程。 您正在执行JavaFX操作,该操作应该在Swing线程(Event Dispatch Thread)上的JavaFX线程上运行。

幸运的是,他们从之前的错误中吸取了教训,现在当你在错误的线程上执行操作时会抛出exception。 这是你遇到的例外。

使用Platform#runLater ,如该教程中所示

 Platform.runLater(new Runnable() { @Override public void run() { //javaFX operations should go here } }); 

JFXPanel的构造可以保留在EDT上(在该教程中也有说明)