JavaFx 2.x - Swing : Pas sur FX application thread
Je suis en train d'utiliser JavaFx 2.x et Swing application à l'aide d'une JInternalFrame dans lequel joindre un JFXPanel
Mon code ci-dessous
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);
}
});
}
}
J'ai cette 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)
Pour mes fins, je dois utiliser une JInternalFrame: comment puis-je résoudre ce problème?
OriginalL'auteur Alberto acepsut | 2012-08-29
Vous devez vous connecter pour publier un commentaire.
Voir le 'JavaFX dans Swing" tutoriel. Vous effectuez JavaFX opérations qui doivent s'exécuter sur le JavaFX thread sur la Balançoire fil (Event Dispatch Thread).
Heureusement qu'ils ont appris de leurs erreurs passées et maintenant lancer des exceptions lorsque vous effectuez des opérations sur le mauvais fil. C'est l'exception-vous rencontré.
Utiliser le
Platform#runLater
comme indiqué dans le tutorielLa construction de la
JFXPanel
peut rester sur l'EDT (qui est également illustré dans le tutoriel)au javafxapplication2.InternalFrameWithJavafx$2.exécuter(InternalFrameWithJavafx.java:95) à java.awt.de l'événement.InvocationEvent.dispatch(InvocationEvent.java:251) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705) at java.awt.EventQueue.l'accès$000(EventQueue.java:101) à java.awt.EventQueue$3.exécuter(EventQueue.java:666) à java.awt.EventQueue$3.exécuter(EventQueue.java:664) à java.de sécurité.AccessController.doPrivileged(Native method) at java.de sécurité.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
t java.awt.EventQueue.dispatchEvent(EventQueue.java:675) à java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) à java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) à java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) à java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) à java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) à java.awt.EventDispatchThread.exécuter(EventDispatchThread.java:90)
Merci d'ajouter cette information dans votre question décent avec mise en forme
OriginalL'auteur Robin