JavaFX 和 Swing 性能问题
JavaFX and Swing performance issues
在基于 Swing 的应用程序中 运行在 JFXPanel 中使用 JavaFX 时,我们一直遇到性能问题。
这似乎只有在 JDK1.7 上 运行 时才会出现问题,因为只要有可能 运行 JDK1.8 就可以在不更改任何代码的情况下完美运行。
症状是应用程序似乎以模糊的方式呈现字体,而且性能也很糟糕(在 TextField 中键入时需要几秒钟来响应按键)。
我们正在遵守有关 EDT、AWT 和平台线程的正确规则,因此我怀疑这可能是问题所在。
我们不得不支持 JDK1.7,因为这是 NetBeans 的插件,一些用户出于各种原因 运行宁愿使用 JDK1.7,我们不能强迫他们升级。
编辑:这是重现问题的 MCVE
package javaapplication3;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class Test {
private static void initAndShowGUI() {
// This method is invoked on the EDT thread
JFrame frame = new JFrame("Swing and JavaFX");
final JFXPanel fxPanel = new JFXPanel();
frame.add(fxPanel);
frame.setSize(300, 200);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Platform.runLater(new Runnable() {
@Override
public void run() {
initFX(fxPanel);
}
});
}
private static void initFX(JFXPanel fxPanel) {
// This method is invoked on the JavaFX thread
Scene scene = createScene();
fxPanel.setScene(scene);
}
private static Scene createScene() {
Group root = new Group();
Scene scene = new Scene(root, Color.ALICEBLUE);
TextField text = new TextField();
Label label = new Label();
VBox box = new VBox();
label.setText("This is a test label");
box.getChildren().add(label);
box.getChildren().add(text);
root.getChildren().add(box);
return (scene);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
initAndShowGUI();
}
});
}
}
我们正在执行的测试有非常简单的 javafx,例如只有一个带有 TextField 的 AnchorPane,它背后绝对没有代码,只是在 TextField 中输入非常慢。
行为看起来很像 Swing 和 JavaFX 线程之间的锁争用,但我们似乎找不到任何解释或解决方案。
这不是您正在寻找的答案,但由于我们在 Java 7 支持方面遇到了同样的问题,答案是 Java 7 已达到生命周期的尽头:
July 2015: Updates for Java 7 are no longer available to the public.
Oracle offers updates to Java 7 only for customers who have purchased
Java support or have Oracle products that require Java 7.
https://www.java.com/en/download/faq/java_7.xml
没有 "good reasons" 如果解决问题就像使用不同的 java 版本一样简单。升级到 Java 8.
不会破坏任何东西
在基于 Swing 的应用程序中 运行在 JFXPanel 中使用 JavaFX 时,我们一直遇到性能问题。
这似乎只有在 JDK1.7 上 运行 时才会出现问题,因为只要有可能 运行 JDK1.8 就可以在不更改任何代码的情况下完美运行。
症状是应用程序似乎以模糊的方式呈现字体,而且性能也很糟糕(在 TextField 中键入时需要几秒钟来响应按键)。
我们正在遵守有关 EDT、AWT 和平台线程的正确规则,因此我怀疑这可能是问题所在。
我们不得不支持 JDK1.7,因为这是 NetBeans 的插件,一些用户出于各种原因 运行宁愿使用 JDK1.7,我们不能强迫他们升级。
编辑:这是重现问题的 MCVE
package javaapplication3;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class Test {
private static void initAndShowGUI() {
// This method is invoked on the EDT thread
JFrame frame = new JFrame("Swing and JavaFX");
final JFXPanel fxPanel = new JFXPanel();
frame.add(fxPanel);
frame.setSize(300, 200);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Platform.runLater(new Runnable() {
@Override
public void run() {
initFX(fxPanel);
}
});
}
private static void initFX(JFXPanel fxPanel) {
// This method is invoked on the JavaFX thread
Scene scene = createScene();
fxPanel.setScene(scene);
}
private static Scene createScene() {
Group root = new Group();
Scene scene = new Scene(root, Color.ALICEBLUE);
TextField text = new TextField();
Label label = new Label();
VBox box = new VBox();
label.setText("This is a test label");
box.getChildren().add(label);
box.getChildren().add(text);
root.getChildren().add(box);
return (scene);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
initAndShowGUI();
}
});
}
}
我们正在执行的测试有非常简单的 javafx,例如只有一个带有 TextField 的 AnchorPane,它背后绝对没有代码,只是在 TextField 中输入非常慢。
行为看起来很像 Swing 和 JavaFX 线程之间的锁争用,但我们似乎找不到任何解释或解决方案。
这不是您正在寻找的答案,但由于我们在 Java 7 支持方面遇到了同样的问题,答案是 Java 7 已达到生命周期的尽头:
July 2015: Updates for Java 7 are no longer available to the public. Oracle offers updates to Java 7 only for customers who have purchased Java support or have Oracle products that require Java 7.
https://www.java.com/en/download/faq/java_7.xml
没有 "good reasons" 如果解决问题就像使用不同的 java 版本一样简单。升级到 Java 8.
不会破坏任何东西