我需要一个解决方案来仅使用 CSS 创建闪烁效果。我发现 JavaFX 23 中添加了 CSS 转换(link)。但是,我无法使用它创建闪烁。这是我的代码:
public class JavaFxTest10 extends Application {
@Override
public void start(Stage primaryStage) {
var label = new Label("Hello, world!");
label.setStyle("visibility:visible; transition-property: visibility; transition-duration: 0.5s;");
VBox root = new VBox(label);
Scene scene = new Scene(root, 400, 200);
primaryStage.setTitle("Blinking Example");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
如果可能的话,谁能告诉我该怎么做吗?
所以如果你实现@DaveB 在他的评论中提到的内容,它将如下所示。
import javafx.application.Application;
import javafx.css.PseudoClass;
import javafx.css.TransitionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class JavaFxTest10 extends Application {
public static final String CSS = "data:text/css," + // language=CSS
"""
.myLabel{
-fx-font-size:20px;
-fx-opacity: 1;
transition: -fx-opacity 200ms ease;
}
.myLabel:blink{
-fx-opacity: 0;
}
""";
@Override
public void start(Stage primaryStage) {
var blink = PseudoClass.getPseudoClass("blink");
var label = new Label("Hello, world!");
label.getStyleClass().add("myLabel");
label.addEventHandler(TransitionEvent.END, event -> label.pseudoClassStateChanged(blink, !label.getPseudoClassStates().contains(blink)));
VBox root = new VBox(label);
Scene scene = new Scene(root, 400, 200);
scene.getStylesheets().add(CSS);
primaryStage.setTitle("Blinking Example");
primaryStage.setScene(scene);
primaryStage.setOnShown(e -> label.pseudoClassStateChanged(blink, true));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}