2012-04-11 9 views
5

Ho creato un'applicazione di esempio che provoca una perdita di memoria.Perdita di memoria JavaFX 2.0 durante la creazione di più scene

Il problema è che ho bisogno di "ricaricare" le scene. Se ho due scene (Bar e Foo) con un pulsante ciascuna (ButtonBar e ButtonFoo), i pulsanti cambiano la scena corrente creando una nuova. Se continuo a fare clic su ButtonBar e ButtonFoo per 5 minuti (o meno), il consumo di memoria di quel semplice programma aumenta sempre più.

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 
}  
} 

Il Foo.java è lo stesso cambiamento de fxml carico.

L'fxml contiene un solo pulsante:

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

C'è un vero e proprio problema di memoria? Qualcuno conosce un altro modo per farlo? Voglio che questa app rimanga in vita e faccia cambiamenti per sempre, come un servizio. Grazie

risposta

1

Sono con un problema simile.

Quando sposto il mouse sulla scena. L'utilizzo della memoria aumenta e mai inattivo.

Credo sia associato agli eventi del mouse.

Buona fortuna!

+1

Yep. Qualsiasi interazione con Scene Builder aumenta la memoria in modo esponenziale ... questa è l'ultima versione scaricata dal sito di Java. WTF sta succedendo qui? Questo è 2 anni dopo il tuo post ... – crush

1

Non sono sicuro delle perdite di memoria, ma per motivi di prestazioni eviterei il caricamento ripetuto della risorsa.

Quello che faccio è mantenere il genitore radice in una variabile e aggiungerlo a una scena, o nel mio caso a una parte specifica di un'altra scena, se necessario, aggiornando i valori tramite un metodo statico della classe controller.

Ho alcune di queste scene precaricate, che aggiornano una parte di una scena più grande ogni volta che l'utente seleziona determinati valori da una lista.

1

Ti suggerisco di provare FX8. Una quantità di correzioni per perdite di memoria sono già state fatte lì.

Nel caso in cui non si riesca a eseguire l'aggiornamento all'ultima versione di JavaFX, suggerisco di non utilizzare onAction="#toFoo" in FXML.

Piuttosto, dichiarare un gestore di eventi e chiamare il seguente: buttonBar.addEventHandler(MouseEvent.MOUSE_CLICKED, declaredEventHandler);.

uscita poi il gestore di eventi prima di uscire il vostro schermo corrente: buttonBar.removeEventHandler(declaredEventHandler);