2

In my JavaFX application I have to load many fxml files (200+) in the same time. I have decided to load them in background Task just like in https://stackoverflow.com/a/34878843 answear. Everything works fine (load time was acceptable) until JDK update. Newest version of JDK lengthened load time 3-4 times.

I have checked previous JDK releases and that problem appears from the JDK 8u92.

To test that issue I created new simple JavaFX FXML Application in Netbeans 8.1 and use only generated classes and fxml. Creating view from code works fine.

Application class:

public class FXMLLoaderTest extends Application {

    private static Executor ex = Executors.newCachedThreadPool();
    //private static Executor ex = Executors.newFixedThreadPool(400);
    //private static Executor ex = Executors.newSingleThreadExecutor();

    @Override
    public void start(Stage stage) throws Exception {

        VBox box = new VBox();
        ScrollPane root = new ScrollPane(box);

        Button b = new Button("GENERATE");

        b.setOnAction(e -> {
            IntStream.range(0, 1000).forEach(i -> {

                Task<Parent> task = new Task<Parent>() {
                    @Override
                    protected Parent call() throws Exception {
                        FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLDocument.fxml"));

                        Parent root = null;
                        try {
                            root = loader.load();
                        } catch (IOException ex) {
                            Logger.getLogger(Loader.class.getName()).log(Level.SEVERE, null, ex);
                        }

                       // StackPane root= new StackPane();
                       // Button click = new Button("Click");
                       // root.setPrefSize(300, 300);
                       // root.getChildren().add(click);
                        return root;
                    }
                };

                task.setOnSucceeded(ev -> {
                    final Parent parent = task.getValue();
                    box.getChildren().add(parent);
                });

                task.setOnFailed(ev -> task.getException().printStackTrace());

                ex.execute(task);
            });

        });

        box.getChildren().add(b);

        Scene scene = new Scene(root, 400, 500);

        stage.setScene(scene);
        stage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
}

FXMLDocument.fxml

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fxmlloader.FXMLDocumentController">
    <children>
        <Button layoutX="126" layoutY="90" text="Click Me!" onAction="#handleButtonAction" fx:id="button" />
        <Label layoutX="126" layoutY="120" minHeight="16" minWidth="69" fx:id="label" />
    </children>
</AnchorPane>

FXMLDocumentController.java

public class FXMLDocumentController implements Initializable {

    @FXML
    private Label label;

    @FXML
    private void handleButtonAction(ActionEvent event) {
        System.out.println("You clicked me!");
        label.setText("Hello World!");
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }

}

I have tested this on several computers and result was always the same. On JDK 8u91 fxml files load fast. I have checked release note of 8u92 and I haven't found any changes in FXMLLoader class.

Has anybody encounter this issue? Mayby I am doing something wrong then please correct me.

Community
  • 1
  • 1
MBec
  • 2,172
  • 1
  • 12
  • 15
  • In case you think you've found a regression bug, please file the issue here: http://bugs.java.com/ – Puce Aug 12 '16 at 12:35

0 Answers0