Как заставить текстовое содержимое исчезнуть через некоторое время в JavaFX?
b1.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
try {
Class.forName("com.mysql.jdbc.Driver");
connect = DriverManager
.getConnection("jdbc:mysql://localhost:3306/project?"
+ "user=root&password=virus");
statement = connect.createStatement();
preparedStatement = connect
.prepareStatement("select * from mark where clsnum = " + txt1.getText() + "");
rs = preparedStatement.executeQuery();
if (rs.next()) {
delete();
} else {
msg.setText("Student Not Found...!");
}
} catch (ClassNotFoundException | SQLException ex) {
Logger.getLogger(DeleteMark.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
Это мой код для отображения сообщения, если запрос не сработал (я имею в виду, если строка ResultSet rs не возвращена). msg является объектом Text и его декларация и другие детали -
Text msg = new Text();
msg.setFont(Font.font("Calibri", FontWeight.THIN, 18));
msg.setFill(Color.RED);
Я хочу, чтобы текст исчез через 3 или 4 секунды. Возможно ли сделать это в JavaFX (с помощью таймера или чего-то еще, что вы знаете)? Если да, то как?
1 ответ
Используйте временные шкалы и / или переходы.
Этот ответ для предыдущей итерации вопроса.
Пример кода решения
import javafx.animation.*;
import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Duration;
public class BlinkingAndFading extends Application {
@Override
public void start(Stage stage) {
Label label = new Label("Blinking");
label.setStyle("-fx-text-fill: red; -fx-padding: 10px;");
Timeline blinker = createBlinker(label);
blinker.setOnFinished(event -> label.setText("Fading"));
FadeTransition fader = createFader(label);
SequentialTransition blinkThenFade = new SequentialTransition(
label,
blinker,
fader
);
stage.setScene(new Scene(new StackPane(label), 100, 50));
stage.show();
blinkThenFade.play();
}
private Timeline createBlinker(Node node) {
Timeline blink = new Timeline(
new KeyFrame(
Duration.seconds(0),
new KeyValue(
node.opacityProperty(),
1,
Interpolator.DISCRETE
)
),
new KeyFrame(
Duration.seconds(0.5),
new KeyValue(
node.opacityProperty(),
0,
Interpolator.DISCRETE
)
),
new KeyFrame(
Duration.seconds(1),
new KeyValue(
node.opacityProperty(),
1,
Interpolator.DISCRETE
)
)
);
blink.setCycleCount(3);
return blink;
}
private FadeTransition createFader(Node node) {
FadeTransition fade = new FadeTransition(Duration.seconds(2), node);
fade.setFromValue(1);
fade.setToValue(0);
return fade;
}
public static void main(String[] args) {
launch(args);
}
}
Ответы на дополнительные вопросы
лямбда-выражение здесь не ожидается лямбда-выражения не поддерживаются в -source 1.7 (используйте -source 8 или выше для включения лямбда-выражений)
Вы должны использовать Java 8, а не установить -source 1.7
, Если вы хотите придерживаться Java 7 (что я не советую для работы с JavaFX), вы можете заменить Lambda:
blinker.setOnFinished(event -> label.setText("Fading"));
с:
blinker.setOnFinished(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
label.setText("Fading");
}
});
фактические и формальные списки аргументов различаются по длине
Опять же, вы должны использовать Java 8. Но если вы хотите использовать Java 7, замените:
stage.setScene(new Scene(new StackPane(label), 100, 50));
с:
StackPane layout = new StackPane();
layout.getChildren().add(label);
stage.setScene(new Scene(layout, 100, 50));
Дальнейшие рекомендации
Хороший призыв к тому, чтобы текст не мигал и не исчезал. Мигающий текст делает довольно отвлекающим пользовательский интерфейс, но просто исчезать это хорошо.
Я не думаю, что я бы порекомендовал исчезнуть сообщение об ошибке, по крайней мере, пока пользователь не нажмет на него или что-то в этом роде. Что если пользователь не увидел сообщение об ошибке до того, как оно исчезло?