使用 JavaFX 显示"Flash"消息



我的目标是拥有一个显示flash消息(顶部的小消息,如通知(的功能,这些消息会在几秒钟后消失。我目前使用stagejavafx.concurrent.Task:来实现这一点

public static void showFlashMessage(String message) {
Stage window = new Stage();
window.initStyle(StageStyle.UNDECORATED);
...
Scene scene = new Scene(layout);
window.setScene(scene);
window.show();
Task<Void> task = new Task<>() {
@Override
protected Void call() throws Exception {
Thread.sleep(3000);
return null;
}
};
task.setOnSucceeded(e -> {
window.close();
});
new Thread(task).start();
}

但当用户点击主舞台时,闪烁的信息就会消失。调用window.toFront()只会将窗口移动到前面的窗口。我希望这个消息在任何地方看起来都一样,就像Alert中的构建一样,但我不能设置window.initModality(Modality.APPLICATION_MODAL),因为这不允许与主阶段交互。有什么好方法可以做到这一点吗?我几乎无法在现有的布局中显示这些消息,它们的结构非常不同,而且在任何地方看起来都不一样。舞台的第二个好处是,它可以在背景中的布局变化中幸存下来。

如前所述,设置Stage.setAlwaysOnTop(true)将起作用。

虽然Task可以工作,但对于纯屏幕动画,您可能应该使用JavaFX动画工具。Timeline在这里工作得很好,还允许您通过在布局上进行轻微的淡入淡出来使flash消息更流畅。像这样:

private void showFlashMessage(String message) {
Stage window = new Stage();
window.initStyle(StageStyle.TRANSPARENT);
VBox layout = new VBox(10, new Text(message));
layout.setPadding(new Insets(3));
layout.setBackground(new Background(new BackgroundFill(Color.PINK, new CornerRadii(3), Insets.EMPTY)));
window.setScene(new Scene(layout, Color.TRANSPARENT));
window.setAlwaysOnTop(true);
Timeline timeline = new Timeline(new KeyFrame(Duration.ZERO, evt -> window.show(), new KeyValue(layout.opacityProperty(), 0)),
new KeyFrame(Duration.millis(200), new KeyValue(layout.opacityProperty(), 1.0)),
new KeyFrame(Duration.millis(2600), new KeyValue(layout.opacityProperty(), 1.0)),
new KeyFrame(Duration.millis(3000), new KeyValue(layout.opacityProperty(), 0.2)));
timeline.setOnFinished(evt -> window.close());
timeline.play();
}

要使其按您的意愿工作,您可以指定后台文件的所有者Window。这必须在舞台可见之前发生。

window.initOwner(ownerStage);

否则,您也可以考虑将"窗口"设置为"始终位于顶部"。

window.setAlwaysOnTop(true); 

你可能还想看看这篇文章:https://stackoverflow.com/a/38373408/14464722

它展示了如何制作Android风格的Toast。

最新更新