JavaFX 和 Swing 性能问题

标签 java swing javafx netbeans-plugins jdk1.7

在基于 Swing 的应用程序中的 JFXPanel 内运行 JavaFX 时,我们一直遇到永久性的性能问题。

这似乎只有在 JDK1.7 上运行时才会出现问题,因为只要可以运行 JDK1.8,它就可以完美运行,无需更改任何代码。

症状是应用程序似乎以模糊的方式呈现字体,而且性能很糟糕(在文本字段中键入时需要数秒时间来响应按键)。

我们正在遵守有关 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

如果解决问题就像使用不同的 java 版本一样简单,那么就没有“充分的理由”。升级到 Java 8 不会破坏任何东西。

关于JavaFX 和 Swing 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31870290/

相关文章:

java - 如何在 Java 中向 Blowfish 加密算法添加时间戳?

JavaFX ScrollPane 禁用箭头键滚动

netbeans 之外的 java hashmap 空指针

JavaFx WebView - 滚动到所需位置

Junit5 参数化测试尝试时,Java 异常未找到匹配的测试

java - 从Proto Buff实现服务器时无法解析符号类-一元API

java - Java中如何将参数从一个类传递到另一个类?

Java GUI 将 JList 添加到另一个文件中的类

Java JList 仅在最小化或最大化后刷新

java - 实现数据库监听器