2015-08-07 3 views
0

У нас были проблемы с производительностью при запуске 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, но похоже, что мы не можем найти никаких объяснений или решений.

+0

отсутствует там invokeLater для EDT (то же самое, что есть правильно - Platform.runLater (новый Runnable() {), для лучшей помощи, скорее всего, опубликуйте SSCCE/MCVE, короткий , runnable, compilable – mKorbel

+0

Мне любопытно, что это за «различные веские причины»? – Roland

+0

Отображается весь интересный код. События не связаны, и приложение ничего не делает, кроме отображения TextField, который помещается на AnchorPane используя SceneBuilder. – Cobusve

ответ

2

Это не ответ, который вы ищете, но так как у нас есть та же самая проблема с поддержкой Java 7, ответ в том, что Java 7 достигла своего конца жизни:

июля 2015 года: Обновления для Java 7 больше не доступны для общественности. Oracle предлагает обновление для Java-только для клиентов, которые приобрели поддержку Java или имеют продукты Oracle, которые требуют Java 7.

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

Там нет «веских причин», если решение проблемы так просто, как используя другую версию java. Вы не нарушаете вещи, перейдя на Java 8.

+0

Я принимаю это, потому что похоже, что нет другого реального решения, кроме использования 1.8, который отлично работает. – Cobusve

 Смежные вопросы

  • Нет связанных вопросов^_^