Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX动画恢复到原始状态_Java_Javafx_Javafx 8 - Fatal编程技术网

JavaFX动画恢复到原始状态

JavaFX动画恢复到原始状态,java,javafx,javafx-8,Java,Javafx,Javafx 8,我的目标是在节点上创建一些动画(例如淡入淡出过渡),作为发生某些事情的临时通知。我希望动画完全消失,就像事情结束时它从未发生过一样 下面截取的代码就是我遇到的问题的一个例子。在当前状态下,当按下按钮停止进程时,按钮将保持其当前不透明度。如果注释行未注释,则按钮将不再保持当前的不透明度,而是更新为看起来正确。我的问题是,当再次点击按钮时,默认样式表的CSS不透明度(JavaFX8的Modena.CSS)不再生效 是我做错了什么,还是有更好的方法 package gui.control.custom

我的目标是在节点上创建一些动画(例如淡入淡出过渡),作为发生某些事情的临时通知。我希望动画完全消失,就像事情结束时它从未发生过一样

下面截取的代码就是我遇到的问题的一个例子。在当前状态下,当按下按钮停止进程时,按钮将保持其当前不透明度。如果注释行未注释,则按钮将不再保持当前的不透明度,而是更新为看起来正确。我的问题是,当再次点击按钮时,默认样式表的CSS不透明度(JavaFX8的Modena.CSS)不再生效

是我做错了什么,还是有更好的方法

package gui.control.custom;

import javafx.animation.Animation;
import javafx.animation.FadeTransition;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Test extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        Stage stage = new Stage();
        HBox box = new HBox();

        streamButton = new Button("Start");
        streamButton.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                if (started) {
                    stopProcess();
                } else {
                    startProcess();
                }
            }

        });
        box.getChildren().add(streamButton);
        stage.setScene(new Scene(box));
        stage.show();
    }

    FadeTransition ft;
    Button streamButton;
    boolean started = false;

    private void startProcess() {
        streamButton.setDisable(true);
        new Thread() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException ex) {
                }
                Platform.runLater(() -> {
                    started = true;
                    streamButton.setText("Stop");
                    streamButton.setDisable(false);
                    startButtonAnim();
                });
            }
        }.start();
    }

    private void stopProcess() {
        streamButton.setText("Start");
        stopButtonAnim();
        started = false;
    }

    private void startButtonAnim() {
        ft = new FadeTransition(Duration.millis(500), streamButton);
        ft.setFromValue(1.0);
        ft.setToValue(0.3);
        ft.setCycleCount(Animation.INDEFINITE);
        ft.setAutoReverse(true);
        ft.play();
    }

    private void stopButtonAnim() {
        ft.stop();
        //streamButton.setOpacity(1);
    }

    public static void main(String[] args) {
        launch();
    }

}
包gui.control.custom;
导入javafx.animation.animation;
导入javafx.animation.FadeTransition;
导入javafx.application.application;
导入javafx.application.Platform;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.layout.HBox;
导入javafx.stage.stage;
导入javafx.util.Duration;
公共类测试扩展了应用程序{
@凌驾
public void start(Stage primaryStage)引发异常{
阶段=新阶段();
HBox box=新的HBox();
streamButton=新按钮(“开始”);
setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
如果(启动){
stopProcess();
}否则{
startProcess();
}
}
});
box.getChildren().add(streamButton);
舞台场景(新场景(框));
stage.show();
}
衰减转换;
按钮流按钮;
布尔值=false;
私有void startProcess(){
streamButton.setDisable(真);
新线程(){
@凌驾
公开募捐{
试一试{
睡眠(3000);
}捕获(中断异常例外){
}
Platform.runLater(()->{
开始=真;
streamButton.setText(“停止”);
streamButton.setDisable(false);
startButtonAnim();
});
}
}.start();
}
私有void stopProcess(){
streamButton.setText(“开始”);
stopputtonanim();
开始=错误;
}
私有void startButtonAnim(){
ft=新的音量转换(持续时间为500毫秒,streamButton);
ft.setFromValue(1.0);
ft.setToValue(0.3);
ft.setCycleCount(动画不确定);
ft.setAutoReverse(真);
ft.play();
}
私有void stopButtonAnim(){
ft.停止();
//streamButton.setOpacity(1);
}
公共静态void main(字符串[]args){
发射();
}
}

我会尝试一下这个简单的
stop()此行

setOnFinished(e->tryToStop());
并将此方法创建为:

public void tryToStop(){
    if(!started)
        fm.stop();
}
stopProcess()
方法更改
started
变量,因此在以下两种情况下它将停止:

  • 如果完成了
  • 如果要求停止
  • 没有测试,只是一个想法

    另一个想法:

    我在javadoc中找到了这个方法:, 这会给你带来负面的反转结果,所以代码如下所示:

    private void stopButtonAnim() {
        while(ft.getCurrentRate>=0); //waiting till animation goes (skips if already reversing)
        while(ft.getCurrentRate<=0); //and till reverse
        ft.stop(); //then stop
        streamButton.setOpacity(1); //make it 100% ;)
    }
    
    private void stopButtonAnim(){
    while(ft.getCurrentRate>=0);//等待动画开始(如果已经反转,则跳过)
    
    而(ft.getCurrentRate我认为最好的解决方案是在停止
    动画之前使用
    。将持续时间设置为
    duration.ZERO

    Circle circle2 = new Circle(250, 120, 80);
    circle2.setFill(Color.RED);
    circle2.setStroke(Color.BLACK);
    FadeTransition fade = new FadeTransition();
    fade.setDuration(Duration.millis(5000));
    fade.setFromValue(10);
    fade.setToValue(0.1);
    fade.setCycleCount(1000);
    fade.setAutoReverse(true);
    fade.setNode(circle2);
    fade.play();
    
    Button btnStop = new Button("Stop");
    btnStop.setOnAction((event) -> {
        fade.jumpTo(Duration.ZERO);
        fade.stop();
    });
    

    谢谢你的回复。我试过了,但没用,按钮一直在闪烁。我不认为当动画不确定且自动反转时,会触发未完成的侦听器。