2013-06-25 15 views
10

Ich habe versucht, einen Skalierungsübergang für eine JavaFX-Bühne zu machen, um die aktuelle Szene (in diesem Fall einen Login-Rahmen) für das Hauptfenster einer Anwendung zu ersetzen.
Wenn dies geschieht, wird die Größe der neuen Szene abrupt erhöht, da die neue Szene größer ist.Wie erstelle ich eine Animation zur Größenanpassung für JavaFX?

Gibt es eine Möglichkeit, einen Skalierungs- oder Größenänderungsübergang für die Größenänderung der Bühne einzurichten?

Relevante Code:

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

Antwort

5

ich Ihre Idee sehr gut gefallen, so konnte ich ein wenig etwas tun. Ich hoffe, dass dir das weiterhilft.

Ich benutzte eine Timer, um die Bühne Breite und Höhe alle 25ms zu ändern, um den Eindruck einer Animation zu geben.

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

Das ist eine nette Art, es zu tun. Ich habe mich dafür entschieden, eine neue Stage zu erstellen und fading-Übergänge zwischen ihnen zu verwenden, um es auf eine elegante Weise zu tun, aber dein Vorschlag scheint gut zu sein, also werde ich es so schnell wie möglich versuchen. – fturizo

+3

Besser JavaFX-integrierte Animationsfunktionen wie Timeline anstelle eines Timers zu verwenden. Mit einem Timer haben Sie einen anderen Thread und der Code ist nicht Thread-sicher, es sei denn, Sie wickeln die Aufrufe, die das Bühnen- oder Szenendiagramm in Platform.runLater() - Aufrufen manipulieren. – jewelsea

2

Sie können auch Animationsmechanismus mit Timeline verwenden.
Ein Beispiel ist verfügbar here.

Das einzige Problem ist, dass Stage keine beschreibbare Höhe oder Breite Eigenschaft haben und Sie müssen es selbst erstellen. Beispiel unten.

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

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

Können Sie die Frage nicht anhand eines Beispielbeispiels beantworten, anstatt Beispiele zu geben? – ryvantage

Verwandte Themen