У нас были проблемы с производительностью при запуске JavaFX внутри JFXPanel в приложениях Swing.Проблемы с производительностью JavaFX и Swing
Это кажется проблемой только при работе на JDK1.7, потому что всякий раз, когда можно запускать JDK1.8, это отлично работает без изменения кода.
Признаки в том, что приложение, похоже, создает шрифты нечетким образом, а также ужасает производительность (несколько секунд, чтобы ответить на нажатия клавиши при вводе текста в TextField).
Мы соблюдаем правильные правила в отношении потоков EDT, AWT и платформы, поэтому я сомневаюсь, что это может быть проблемой.
Мы застряли в поддержке JDK1.7, потому что это плагин для NetBeans, который некоторые пользователи будут запускать на JDK1.7 по разным причинам, и мы не можем заставить их обновляться.
EDIT: Вот 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 с, например, только AnchorPane с TextField на нем и абсолютно никакой код за ним, и просто ввод текста в TextField очень медленный.
Поведение очень похоже на конфликт между конфликтами Swing и JavaFX, но похоже, что мы не можем найти никаких объяснений или решений.
отсутствует там invokeLater для EDT (то же самое, что есть правильно - Platform.runLater (новый Runnable() {), для лучшей помощи, скорее всего, опубликуйте SSCCE/MCVE, короткий , runnable, compilable – mKorbel
Мне любопытно, что это за «различные веские причины»? – Roland
Отображается весь интересный код. События не связаны, и приложение ничего не делает, кроме отображения TextField, который помещается на AnchorPane используя SceneBuilder. – Cobusve