2013-06-25 12 views
10

Próbowałem dokonać przejścia skalowania dla etapu JavaFX, aby zastąpić bieżącą scenę (w tym przypadku ramkę logowania) dla głównego okna aplikacji.
Kiedy to się dzieje, ponieważ nowa scena jest większa, okna zmieniają się gwałtownie w nie-elegancki sposób.Jak utworzyć animację zmiany rozmiaru dla etapu JavaFX?

Czy jest jakiś sposób ustawienia zmiany rozmiaru lub zmiany rozmiaru, aby zrobić to na etapie zmiany rozmiaru?

odpowiedni kod:

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

Odpowiedz

5

bardzo lubiłem swój pomysł, więc udało mi się zrobić trochę coś. Mam nadzieję, że to ci pomoże.

Użyłem Timer, aby zmienić szerokość i wysokość sceny co 25 ms, aby sprawić wrażenie animacji.

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

To dobry sposób na zrobienie tego. Zdecydowałem się na stworzenie nowego Etapu i używanie zaciekłych przejść między nimi, aby zrobić to w elegancko, ale twoja sugestia wydaje się dobra, więc spróbuję jak najszybciej. – fturizo

+3

Lepiej używać wbudowanych mechanizmów animacji JavaFX, takich jak Oś czasu, a nie Zegar. Z zegarem masz inny wątek, a kod nie jest bezpieczny dla wątków, chyba że zawiniesz połączenia, które manipulują wykresem sceny lub sceny w wywołaniach Platform.runLater(). – jewelsea

2

Można również użyć mechanizmu animacji z Timeline.
Przykład jest dostępny pod numerem here.

Jedynym problemem jest to, że Stage nie ma właściwości zapisu lub wysokości i musisz ją utworzyć według własnego uznania. Przykład poniżej.

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

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

Zamiast podawać przykładowe linki, czy mógłbyś odpowiedzieć na pytanie pełnym przykładem? – ryvantage

Powiązane problemy