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 スレッド間のロック競合に非常によく似ていますが、説明や解決策が見つからないようです。