2013-06-25 15 views
10

Ho cercato di eseguire una transizione di ridimensionamento per uno stage JavaFX per sostituire la scena corrente (in questo caso un frame di accesso) per la finestra principale di un'applicazione.
Quando ciò accade, poiché la nuova scena è più grande, le finestre vengono ridimensionate in modo non elegante.Come si crea un'animazione Resize per lo stage JavaFX?

C'è un modo per impostare un ridimensionamento o ri-formato di transizione per fare questo per il ridimensionamento palco?

codice rilevante:

InputStream is = null; 
try { 
    is = getClass().getResourceAsStream("/fxml/principal.fxml"); 
    Region pagina = (Region) cargadorFXML.load(is); 
    cargadorFXML.<ContenedorPrincipal>getController().setEscenario(escenario); 

    final Scene escena = new Scene(pagina, 900, 650); 

    escena.setFill(Color.TRANSPARENT); 
    escenario.setScene(escena); 
    escenario.sizeToScene(); 
    escenario.centerOnScreen(); 
    escenario.show(); 
} catch (IOException ex) { 
    // log "Unable to load the main application driver" 
    log.error("No fue posible cargar el controlador principal de la aplicación."); 
    log.catching(ex); 
} finally { 
    if (is != null) { 
     try { 
      is.close(); 
     } catch (IOException e) {} 
    } 
} 

risposta

5

mi piaceva molto la tua idea in modo sono riuscito a fare un po 'di qualcosa. Spero che questo ti possa aiutare.

Ho utilizzato uno Timer per modificare la larghezza e l'altezza dello stage ogni 25 ms per dare l'impressione di un'animazione.

import java.util.Timer; 
import java.util.TimerTask; 

import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

public class SmoothResize extends Application { 

    @Override 
    public void start(final Stage stage) throws Exception { 
     stage.setTitle("Area Chart Sample"); 
     Group root = new Group(); 
     Scene scene = new Scene(root, 250, 250); 
     stage.setResizable(false); 

     Timer animTimer = new Timer(); 
     animTimer.scheduleAtFixedRate(new TimerTask() { 
      int i=0; 

      @Override 
      public void run() { 
       if (i<100) { 
        stage.setWidth(stage.getWidth()+3); 
        stage.setHeight(stage.getHeight()+3); 
       } else { 
        this.cancel(); 
       } 
       i++; 
      } 

     }, 2000, 25); 

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

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

Questo è un bel modo di farlo. Ho optato per la creazione di un nuovo stage e l'utilizzo di transizioni di dissolvenza tra di loro per farlo in maniera elegante, ma il tuo suggerimento sembra buono, quindi proverò appena possibile. – fturizo

+3

È meglio utilizzare le funzionalità di animazione incorporate di JavaFX come la Timeline piuttosto che un timer. Con un timer si ha un thread diverso e il codice non è thread-safe a meno che non si avvolgano le chiamate che manipolano il grafico di stage o di scena nelle chiamate Platform.runLater(). – jewelsea

2

È inoltre possibile utilizzare il meccanismo di animazione con Timeline.
Alcuni esempi sono disponibili here.

L'unico problema è che Stage non hanno un'altezza scrivibile o la proprietà di larghezza e bisogna crearla da soli. Esempio di seguito.

WritableValue<Double> writableHeight = new WritableValue<Double>() { 
    @Override 
    public Double getValue() { 
     return stage.getHeight(); 
    } 

    @Override 
    public void setValue(Double value) { 
     stage.setHeight(value); 
    } 
}; 
+0

Invece di fornire collegamenti di esempio, potresti rispondere alla domanda con un esempio completo? – ryvantage

Problemi correlati