0

Swing ベースのアプリケーションで JFXPanel 内で JavaFX を実行すると、永続的なパフォーマンスの問題が発生します。

これは、JDK1.7 で実行する場合にのみ問題になるようです。JDK1.8 を実行できる場合はいつでも、コードを変更することなく完全に機能するためです。

症状は、アプリケーションがフォントをあいまいにレンダリングしているように見えることと、パフォーマンスがひどいことです (TextField に入力するときにキーを押すと応答するのに数秒かかります)。

EDT、AWT、およびプラットフォーム スレッドに関する正しいルールを守っているため、これが問題になるとは思えません。

これは NetBeans のプラグインであり、一部のユーザーがさまざまな正当な理由で JDK1.7 で実行するため、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 スレッド間のロック競合に非常によく似ていますが、説明や解決策が見つからないようです。

4

1 に答える 1

2

これはあなたが探している答えではありませんが、Java 7 のサポートに関して同じ問題があるため、答えは Java 7 が寿命に達したということです。

2015 年 7 月: Java 7 の更新プログラムは公開されなくなりました。Oracle は、Java サポートを購入したか、Java 7 を必要とする Oracle 製品を持っている顧客に対してのみ、Java 7 への更新を提供します。

https://www.java.com/en/download/faq/java_7.xml

問題解決が別の Java バージョンを使用するのと同じくらい簡単である場合、「正当な理由」はありません。Java 8 にアップグレードしても問題が発生することはありません。

于 2015-08-07T05:34:46.977 に答える