如何为JavaFX阶段创建调整大小的动画?

如何为JavaFX阶段创建调整大小的动画?,java,javafx,Java,Javafx,我一直在尝试对JavaFX阶段进行缩放转换,以替换应用程序主窗口的当前场景(在本例中为登录帧)。 发生这种情况时,由于新场景更大,窗口会以不优雅的方式突然重新调整大小 是否有任何方法可以设置缩放或重新调整大小过渡,从而调整舞台的大小 相关代码: InputStream is = null; try { is = getClass().getResourceAsStream("/fxml/principal.fxml"); Region pagina = (Region) carg

我一直在尝试对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) {}
    }
}
InputStream=null;
试一试{
is=getClass().getResourceAsStream(“/fxml/principal.fxml”);
区域pagina=(区域)cargadorFXML.load(is);
cargadorFXML.getController().setescnario(escnario);
最终场景escena=新场景(pagina,900650);
(颜色.透明);
escenario.setScene(escena);
escnario.sizeToScene();
屏幕上的Escnario.center();
escnario.show();
}捕获(IOEX异常){
//日志“无法加载主应用程序驱动程序”
日志错误(“没有可能的cargar el controlador principal de la aplicación.”;
原木捕获(ex);
}最后{
如果(is!=null){
试一试{
is.close();
}捕获(IOE){}
}
}

我真的很喜欢你的想法,所以我设法做了一些事情。 我希望这对你有帮助

我使用了一个
定时器
每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);
    }
}
import java.util.Timer;
导入java.util.TimerTask;
导入javafx.application.application;
导入javafx.scene.Group;
导入javafx.scene.scene;
导入javafx.stage.stage;
公共类SmoothResize扩展了应用程序{
@凌驾
public void start(final Stage)引发异常{
阶段。设置标题(“面积图样本”);
组根=新组();
场景=新场景(根,250,250);
阶段。可设置大小(假);
定时器animTimer=新定时器();
animTimer.scheduleAtFixedRate(新TimerTask(){
int i=0;
@凌驾
公开募捐{

如果(i您也可以使用动画机制。
一些例子是可用的

唯一的问题是
Stage
没有可写的height或width属性,您必须自己创建它。下面的示例

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

    @Override
    public void setValue(Double value) {
        stage.setHeight(value);
    }
};
WritableValue writableHeight=新的WritableValue(){
@凌驾
公共双getValue(){
返回stage.getHeight();
}
@凌驾
公共无效设置值(双值){
舞台设置高度(数值);
}
};

这是一种很好的方法。我选择创建一个新舞台,并在它们之间使用淡入淡出的过渡,以一种优雅的方式完成它,但你的建议似乎很好,所以我会尽快尝试。最好使用JavaFX的内置动画功能,如时间线,而不是计时器。有了计时器,你就有了不同的线程和code不是线程安全的,除非您将操纵Platform.runLater()调用中的阶段或场景图的调用包装起来。除了提供示例链接,您能用完整的示例回答这个问题吗?