JavaFX:隐藏窗格很短的时间

时间:2014-09-18 11:04:21

标签: java javafx visibility

我正在寻找一种方法来隐藏一个短时间(约100毫秒)的窗格,然后立即再次显示它。

现在我在顶部使用带有两个AnchorPanes的StackPane,按下按键我删除顶部窗格。但是,这似乎不会立即发生,而且需要太长时间。

我也尝试使用CSS使顶部窗格不可见,但这似乎根本没有做任何事情。

这里有一些代码:

        pn_middle.setStyle("-fx-background-color: rgba(128, 128, 128, 0);");

        try {
            Thread.sleep(1000); //1 sec for testing
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        pn_middle.setStyle("-fx-background-color: rgba(128, 128, 128, 1);");

2 个答案:

答案 0 :(得分:1)

如果您使用JavaFX 8,这是使用来自ReactFX的计时器的解决方案。与@ ItachiUchiha的解决方案不同,它不会创建任何新线程。

import java.time.Duration;
import org.reactfx.util.FxTimer;

button.setOnAction(event -> {
    pane.setVisible(false);
    FXTimer.runLater(Duration.ofMillis(1000), () -> pane.setVisible(false));
});

答案 1 :(得分:0)

使用Timer计算您要隐藏Pane的时间。试试这个例子,它包含一个StackPane,它有一个Pane,颜色为PINKButton。在click of the Button上,Pane隐藏了1000毫秒

import java.util.Timer;
import java.util.TimerTask;

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.Pane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class HideAndShowPane extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        StackPane stackPane = new StackPane();
        Button button = new Button("Click Me to hide Pane !");
        Pane pane = new Pane();

        button.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    //Hide the Pane
                    pane.setVisible(false);
                    //Schedule the Visibility for 1000ms
                    Timer timer = new Timer();
                    timer.schedule(new TimerTask() {
                          @Override
                          public void run() {
                              //Run on UI thread
                              Platform.runLater(new Runnable() {
                                @Override
                                public void run() {
                                    pane.setVisible(true);                                  
                                }
                            });
                          }
                        }, 1000);   
                }
        });

        pane.setPrefSize(200, 200);
        pane.setStyle("-fx-background-color : PINK");
        stackPane.getChildren().addAll(pane, button);
        Scene scene = new Scene(stackPane, 500, 500);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

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

使用任务

您也可以稍后使用TaskThread.sleep广告将valueProperty任务绑定到visibleProperty Pane来实现此目的>

button.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                //Create a Task
                Task<Boolean> task = new Task<Boolean>() {
                    @Override
                    protected Boolean call() throws Exception {
                        try {
                            //Invisible for 1000ms
                            Thread.sleep(1000);
                        }
                        catch (InterruptedException e) {
                            return Boolean.FALSE;
                        }
                        return Boolean.TRUE;
                    }
                };
                //Start the Task
                new Thread(task).start();
                //Bind the visibility with Task Value
                pane.visibleProperty().bind(task.valueProperty());
         }
});

不创建任何新主题

感谢Tomas Mikula's answer,这也可以在不创建任何新线程的情况下实现。使用TimelineKeyFramesKeyValue

的组合
button.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        pane.setVisible(false);
        Timeline timeline = new Timeline();
        timeline.getKeyFrames().add(
                new KeyFrame(Duration.millis(1000), 
                        new KeyValue(pane.visibleProperty(), true)));
        timeline.play();
    }
});