【问题标题】:How do I create a Resize animation for JavaFX stage?如何为 JavaFX 阶段创建调整大小动画?
【发布时间】:2013-06-22 19:40:11
【问题描述】:

我一直在尝试为 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) {}
    }
}

【问题讨论】:

    标签: java javafx


    【解决方案1】:

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

    我使用Timer 每 25 毫秒更改一次舞台宽度和高度,以便给人一种动画的印象。

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

    【讨论】:

    • 这是一个很好的方法。我选择创建一个新阶段并使用它们之间的淡入淡出过渡以优雅的方式进行,但您的建议似乎不错,所以我会尽快尝试。
    • 最好使用 JavaFX 的内置动画工具,例如 Timeline,而不是 Timer。使用计时器,您有一个不同的线程,并且代码不是线程安全的,除非您将操纵舞台或场景图的调用包装在 Platform.runLater() 调用中。
    【解决方案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);
        }
    };
    

    【讨论】:

    • 您可以用一个完整的例子来回答这个问题,而不是提供示例链接吗?
    猜你喜欢
    • 2014-01-23
    • 2014-06-20
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    相关资源
    最近更新 更多