Bevor ich über den Titel frustriert bin, möchte ich klarstellen, dass ich auf JavaFX UI frischer bin. Ich bin seit 9 Jahren Entwickler mit Swing und habe mich entschieden, JavaFX zu testen. Beispiele im Internet zeigen, dass JavaFX wirklich schöne GUIs im Vergleich zu Swing erstellen kann. Vielleicht versuche ich GUIs auf die falsche Art zu erstellen und zu implementieren, aber eines ist sicher. JavaFX-Fenster laden langsamer als Swing und verbrauchen viel mehr Speicher. Die gleiche GUI wurde mit JAVAFX neu gestaltet und benötigt fast 200 MB, während die Swing GUI nur 50 MB benötigt.JavaFX isst mein Gedächtnis?
Hier gebe ich ein Beispiel für den Code, wie ich die GUIs programmgesteuert mit FXML erstellen.
public class PanelCreator {
private FXMLPane<LoginPaneController> loginFXML;
private FXMLPane<RegistrationPaneController> registerFXML;
private FXMLPane<EmailValidationPaneController> emailValidationFXML;
public PanelCreator() {
this.rootPane = rootPane;
try {
loginFXML = new FXMLPane<LoginPaneController>("Login.fxml");
registerFXML = new FXMLPane<RegistrationPaneController>("Register.fxml");
emailValidationFXML = new FXMLPane<EmailValidationPaneController>("EmailValidation.fxml");
} catch (IOException e) {e.printStackTrace();} // catch
} // Constructor Method
public Pane getLoginPane() {
return loginFXML.getPane();
} // getLoginPane()
public Pane getRegisterPane() {
return registerFXML.getPane();
} // getRegisterPane
public Pane getEmailValidationPane() {
return emailValidationFXML.getPane();
} // getEmailValidationPane
public LoginPaneController getLoginPaneController() {
return loginFXML.getController();
} // getLoginPaneController()
public RegistrationPaneController getRegistrationPaneController() {
return registerFXML.getController();
} // getRegistrationPaneController()
} // class PanelCreator
Der Konstruktor von PanelCreator schafft 3 FXMLPane Klassen, eine Klasse, die sowohl die FXML Pane und seine Steuerung kombiniert. Ein Code der FXMLPane-Klasse wird im folgenden Code angezeigt.
public class FXMLPane<T> {
private Pane pane;
private T paneController;
public FXMLPane(String url) throws IOException {
URL location = getClass().getResource(url);
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(location);
fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
pane = fxmlLoader.load(location.openStream());
paneController = fxmlLoader.<T>getController();
} // Constructor Method
public Pane getPane() {
return pane;
} // getPane()
public T getController() {
return paneController;
} // getController()
}
Durch PanelCreator jetzt kann ich die get-Methoden verwenden, um jeden JavaFX-Panel und seine Controller zu bekommen und ich muß der FXML Load-Methode jedes Mal, um das Panel zu bekommen nicht laufen. Momentan stört mich nicht, dass die Erstellung von FXML-GUIs langsamer als Swing ist, sondern dass der RAM 3x und 4x mehr ist als die entsprechende Swing-Version.
Kann mir jemand erklären, was ich falsch mache? Die FXML-Dateien enthalten nur grundlegende Komponenten in einem Rasterbereich, Komponenten wie Schaltflächen, Ebenen und Textfelder.
Der Code für das obige Beispiel kann here
Haben Sie überprüft, ob der Heap wirklich verbraucht ist? Java verwendet nativen Speicher, wenn er es irgendwann benötigt, aber nie wieder an das Betriebssystem zurückgibt (weil es aus Sicht der Leistung besser ist). Also hast du versucht zu drucken, wie viel Heap übrig ist? – tomsontom
Wie messen Sie den Speicherverbrauch? Können Sie eine einfache Beispielanwendung für eine andere Person zur Verfügung stellen? Führen Sie Ihre vergleichbaren Swing- und JavaFX-Anwendungen auf genau der gleichen Hardware, der gleichen Java-Laufzeitversion und mit denselben Befehlszeilenoptionen aus? – jewelsea
Wirklich zu verstehen, das Speicherverbrauchsverhalten einer Anwendung kann eine schwierige und schwierige Sache sein. Aus dem Code und den Informationen, die Sie bisher zur Verfügung gestellt haben, ist es für andere nicht möglich, den Speicherverbrauch Ihrer Anwendung zu verstehen und zu diagnostizieren, noch konkret festzustellen, was Sie möglicherweise falsch machen. – jewelsea