JavaFX2 - sehr schlechte Leistung, wenn das hinzufügen von benutzerdefinierten gemacht (fxml) - panels gridpane dynamisch
Problem
Ich möchte hinzufügen, benutzerdefinierte gemacht-Paneele, gebaut über javafx scene builder, ein gridpane zur Laufzeit. Meine custom made panel exsits von buttons, labels und so weiter.
Mein Versuch
Ich habe versucht zu verlängern Bereich...
public class Celli extends Pane{
public Celli() throws IOException{
Parent root = FXMLLoader.load(getClass().getResource("Cell.fxml"));
this.getChildren().add(root);
}
}
... und dann dieses panel in die hinzufügen-Methode des conroller
@FXML
private void textChange(KeyEvent event) {
GridPane g = new GridPane();
for (int i=0 : i<100; i++){
g.getChildren().add(new Celli());
}
}
}
Es funktioniert, aber es funktioniert sehr sehr schlecht.
, Was ich bin auf der Suche nach
Gibt es eine Möglichkeit, design-Jurys über die javafx scene builder (und als ein Ergebnis, das diese Platten in fxml) und fügen Sie es zu einem gridpane zur Laufzeit, ohne hiervon Gebrauch zu machen fxmlloader für jede Instanz. Ich denke, es führt schlecht, weil der fxml-loader. Wenn ich einen standard-Taste z.B. ohne fxml ist es sehr viel schneller.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Antwort: Nein, es ist nicht (wie der JavaFX-2.x und 8.0). Es kann in einer zukünftigen version (JFX - >8)
Lange Antwort:
Der FXMLLoader ist derzeit nicht entworfen, um als template-Anbieter, die instanziiert die gleiche Sache über und über wieder. Es ist eher gedacht, um eine one-time-loader für die großen GUIs (oder zu serialisieren).
Die Leistung ist schlecht, da es abhängig von der FXML-Datei bei jedem Aufruf
load()
, den FXMLLoader hat, um die Klassen und deren properties per reflection. Das bedeutet:Gibt es derzeit auch keine Verbesserung für nachfolgende Aufrufe
load()
den gleichen FXML-Datei geschieht in den code. Das bedeutet: keine Zwischenspeicherung der gefundenen Klassen, keine Zwischenspeicherung der BeanAdapters und so weiter.Es ist ein workaround für die Leistung von Schritt 1, aber durch das setzen einer benutzerdefinierten classloader zu den FXMLLoader Beispiel:
Verwendung:
Wird dadurch erheblich beschleunigt die Leistung. Jedoch, es gibt keine Problemumgehung für Schritt 2, so könnte dies noch ein problem sein.
Allerdings gibt es bereits feature-Anfragen in den offiziellen JavaFX jira für diese. Es wäre nett von Euch, um Unterstützung dieser Anträge.
Links:
FXMLLoader sollte in der Lage sein, um cache-Importe und-Eigenschaften zwischen load () - Aufrufe:
https://bugs.openjdk.java.net/browse/JDK-8090848
hinzufügen setAdapterFactory (), um den FXMLLoader:
https://bugs.openjdk.java.net/browse/JDK-8102624
Ich hatte ein ähnliches Problem. Ich hatte auch das laden eines custom-fxml-Basis-Komponente mehrere Male, dynamisch, und es dauerte zu lange. Der FXMLLoader.laden Sie den Aufruf der Methode war teuer, in meinem Fall.
Mein Ansatz war zu parallelisieren, die Komponente die Instanziierung und es löste das problem.
Angesichts der Beispiel gepostet auf die Frage, die controller-Methode mit multithread-Ansatz wäre:
Nur das hinzufügen von code für die "Zwischenspeicherung von bereits geladenen Klassen" in @Sebastian sir angegebenen code. Es ist für mich arbeiten. Bitte machen Sie die änderungen für eine bessere Leistung.