2012-04-11 13 views
5

Ich erstellte eine Beispielanwendung, die ein Speicherleck provoziert.JavaFX 2.0 Speicherverlust beim Erstellen mehrerer Szenen

Das Problem ist, dass ich Szenen "neu laden" muss. Wenn ich zwei Szenen ("Bar" und "Foo") mit je einer Taste (ButtonBar und ButtonFoo) habe, ändert sich mit den Buttons die aktuelle Szene und es entsteht eine neue Szene. Wenn ich ButtonBar und ButtonFoo für 5 Minuten (oder weniger) klicke, wird der Speicherverbrauch dieses einfachen Programms höher und höher.

Bar.java

public class Bar implements Initializable { 

@FXML 
private Label label; 

@FXML 
private void toFoo(ActionEvent event) { 
    try { 
     Button button = (Button) event.getSource(); 
     Parent root = FXMLLoader.load(getClass().getResource("Foo.fxml")); 
     Stage currentStage = (Stage) button.getScene().getWindow(); 
     currentStage.setScene(new Scene(root)); 
    } catch (IOException ex) { 
     Logger.getLogger(Bar.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

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

Die Foo.java ist der gleiche Wechsel de fxml Belastung.

Die fxml nur eine Taste enthalten:

<Button id="buttonBar" layoutX="126" layoutY="90" text="Bar!" onAction="#toFoo" fx:id="buttonBar" /> 

Gibt es ein reales Speicherleck Problem? Kennt jemand einen anderen Weg dies zu tun? Ich möchte, dass diese App am Leben bleibt und sich für immer verändert, wie ein Dienst. Danke

Antwort

1

Ich bin mit einem ähnlichen Problem.

Wenn ich die Maus auf Szene bewegen. Die Speichernutzung steigt und nie nach unten.

Ich glaube, dass dies mit Mausereignissen verbunden ist.

Viel Glück!

+1

Yep. Jede Interaktion mit dem Scene Builder erhöht den Speicher exponentiell. Dies ist die neueste Version, die von der Java-Site heruntergeladen wurde. WTF geht hier vor? Das ist 2 Jahre nach deinem Post ... – crush

1

Ich bin mir nicht sicher über die Speicherlecks, aber aus Leistungsgründen würde ich das wiederholte Laden der Ressource vermeiden.

Was ich tue ist, dass Wurzel Eltern in einer Variablen und fügen Sie es zu einer Szene, oder in meinem Fall zu einem bestimmten Teil einer anderen Szene nach Bedarf, die Aktualisierung der Werte über eine statische Methode der Controller-Klasse.

Ich habe mehrere dieser vorinstallierten Szenen, die jedes Mal einen Teil einer größeren Szene aktualisieren, wenn der Benutzer bestimmte Werte aus einer Liste auswählt.

1

Ich schlage vor, Sie versuchen FX8. Eine Anzahl von Korrekturen für Speicherlecks wurde dort bereits vorgenommen.

Falls Sie nicht auf die neueste Version von JavaFX aktualisieren können, schlage ich vor, dass Sie onAction="#toFoo" nicht in FXML verwenden.

Erklären Sie eher einen Event-Handler und rufen Sie Folgendes auf: buttonBar.addEventHandler(MouseEvent.MOUSE_CLICKED, declaredEventHandler);.

Lassen Sie dann die Ereignishandler vor Ihrem aktuellen Bildschirm verlässt: buttonBar.removeEventHandler(declaredEventHandler);

Verwandte Themen