Как заставить текстовое содержимое исчезнуть через некоторое время в 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 (с помощью таймера или чего-то еще, что вы знаете)? Если да, то как?


person TomJ    schedule 21.04.2014    source источник
comment
Пожалуйста, не публикуйте нерелевантный код, такой как запрос к базе данных, в своем вопросе. Работа с пользовательским интерфейсом не имеет ничего общего с работой с базой данных, и вы должны хранить код вопроса и код реализации отдельно для таких вещей.   -  person jewelsea    schedule 21.04.2014


Ответы (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));

Дополнительные рекомендации

Хороший призыв к тому, чтобы текст не мигал и не исчезал. Мигающий текст делает пользовательский интерфейс довольно отвлекающим, но просто затухание — это нормально.

Я не думаю, что рекомендовал бы исчезать сообщение об ошибке, по крайней мере, пока пользователь не нажмет на него или что-то в этом роде. Что, если пользователь не увидит сообщение об ошибке до того, как оно исчезнет?

person jewelsea    schedule 21.04.2014
comment
Есть 2 ошибки - 1. blinker.setOnFinished(event -> label.setText(Fading)); (Причина - здесь не ожидается лямбда-выражение, лямбда-выражения не поддерживаются в -source 1.7 (используйте -source 8 или выше, чтобы включить лямбда-выражения)) 2. stage.setScene(new Scene(new StackPane(label), 100, 50)) ; ( Причина - конструктор StackPane в классе StackPane не может быть применен к заданным типам; требуется: аргументы не найдены: Причина метки: списки фактических и формальных аргументов различаются по длине). Можете ли вы исправить это 2. Это будет очень полезно. - person TomJ; 21.04.2014
comment
Еще одна помощь. Я отредактировал свой вопрос. Не могли бы вы отредактировать свой ответ в соответствии с ним? - person TomJ; 21.04.2014
comment
Я убрал мигание. Вы только скажите мне, как увеличить время до затухания. - person TomJ; 21.04.2014
comment
Я тоже это нашел. Спасибо за вашу помощь. - person TomJ; 21.04.2014