我正在寻找一种方法来隐藏一个短时间(约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);");
答案 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,颜色为PINK
和Button
。在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);
}
}
使用任务
您也可以稍后使用Task
和Thread.sleep
广告将valueProperty
任务绑定到visibleProperty
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,这也可以在不创建任何新线程的情况下实现。使用Timeline
,KeyFrames
和KeyValue
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();
}
});