我试图通过使用JInternalFrame附加JFXPanel来使用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:如何解决此问题?
请参阅“ Swing中的JavaFX”教程。您正在执行应在Swing线程(事件调度线程)上的JavaFX线程上运行的JavaFX操作。
幸运的是,他们从以前的错误中吸取了教训,现在当您在错误的线程上执行操作时会引发异常。那是您遇到的例外。
使用该Platform#runLater
教程中显示的
Platform.runLater(new Runnable() {
@Override
public void run() {
//javaFX operations should go here
}
});
JFXPanel
罐的构造仍保留在EDT上(该教程中也对此进行了说明)
我正试图通过使用一个JInternalFrame来使用JavaFx2.x和Swing应用程序,其中附加了一个JFXPanel 我在下面的代码 我有这个例外 对于我的目的,我必须使用JInternalFrame:我如何解决这个问题?
问题内容: 我正在尝试从线程中设置文本对象的字符串,但这给了我这个错误: 处理程序类: 我尝试使用,它确实可以工作,但是它使我的程序崩溃。我也尝试在该方法上创建一个Timer,但它给了我与以前相同的错误。 问题答案: 包起来。在它的外面,在while循环中,添加Thread.sleep(1000); 非法状态异常的原因是你试图在JavaFX Application线程以外的其他线程上更新UI。 添
下面的代码片段给我错误< code >不在FX应用程序线程上;当前线程 = < code > Java FX < code >应用程序线程。这个应用程序在java 1.7中运行良好,但是当我把它移到fx8时,它现在出现错误。当我第一次尝试启动应用程序时,它按预期工作。但是在关闭并再次打开舞台后,它不起作用了。 错误也不明确。如果当前线程是fx应用程序线程,那么不在fx应用线程上意味着什么。
问题内容: 我正在用这个 但是这个: 给我这个错误: 而且我真的不明白怎么了 问题答案: 可能是因为您误解了工作原理。 正确的代码段为: 但: 我强烈建议您不要使用,而是使用!它是JavaFX API的一部分,您不必执行这些调用。这只是很快就被黑了,但是您知道了:
问题内容: 我在维护的Swing应用程序中遇到了僵局,尽管我有一个可行的解决方法,但我不确定我是否了解自己在做什么,还没有隐藏可能弹出的竞争条件稍后再试。 线程跟踪显示死锁发生在两个线程AWT-EventQueue-0和AWT- EventQueue-1之间。我的第一个问题是,如果其中一个是臭名昭著的事件调度线程。这两个线程在堆栈跟踪的底部都有以下内容: 我认为问题的根源在于应用程序类将域数据与图
问题内容: Swing应用程序现在真的被使用吗?我找不到使用它们的地方。可以跳过AWT和Swing包吗(尽管我学到了一些基础知识)? 问题答案: 如果您是专门为Web编写的,则可以跳过Swing,否则,您肯定会碰上它。如果没有Swing GUI,我从来没有在非平凡的Java应用程序上工作过。 另外,Swing是更好使用的API之一。如果您使用大多数其他工具,则会发现它们更加难以使用和/或与平台不兼