2013-06-25 7 views
10

私は、アプリケーションのメインウィンドウの現在のシーン(この場合はログインフレーム)を置き換えるために、JavaFXステージ用のスケーリング遷移を作成しようとしてきました。
このような場合、新しいシーンが大きいため、ウィンドウは非エレガントな方法で突然サイズが変更されます。JavaFXステージ用のサイズ変更アニメーションを作成するにはどうすればよいですか?

これをステージのサイズ変更に使用するには、スケーリングまたはサイズ変更を設定する方法はありますか?

関連するコード:

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

答えて

5

私は本当に、私は少し何かをするために管理し、あなたのアイデアを好きでした。 これがあなたを助けてくれることを願っています。

アニメーションの印象を与えるために、Timerを使用してステージの幅と高さを25msごとに変更しました。

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

これは素晴らしい方法です。私は新しいステージを作り、フェイディング・トランジションを使ってエレガントな方法でそれをやりましたが、あなたの提案は良いように見えるので、できるだけ早く試してみましょう。 – fturizo

+3

Timerではなく、TimelineなどのJavaFXのビルトインアニメーション機能を使用する方が効果的です。タイマーでは、別のスレッドがあり、Platform.runLater()の呼び出しでステージまたはシーングラフを操作する呼び出しをラップしない限り、コードはスレッドセーフではありません。 – jewelsea

2

Timelineのアニメーションメカニズムを使用することもできます。
例:hereがあります。

唯一の問題は、Stageに書き込み可能な高さまたは幅のプロパティがなく、自分で作成する必要があることです。以下の例。

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

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

例のリンクを提供するのではなく、完全な例で質問に答えることができますか? – ryvantage

関連する問題