17

我正在尝试通过使用附加 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")
// <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);
        }
    });
}                 
}

我有这个例外

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)

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

4

1 回答 1

47

请参阅“Swing 中的 JavaFX”教程。您正在执行应该在 Swing 线程(事件调度线程)上的 JavaFX 线程上运行的 JavaFX 操作。

幸运的是,他们从以前的错误中吸取了教训,现在当您在错误的线程上执行操作时会抛出异常。那是您遇到的异常。

使用该Platform#runLater教程中所示的

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

罐子的构造JFXPanel保留在 EDT 上(该教程中也说明了这一点)

于 2012-08-29T18:26:53.477 回答