Как дождаться показа следующего тоста (snackBar) с JFoenix

У меня есть следующий код, который запускается при запуске программы. Он служит для отображения всплывающей подсказки, сообщающей, у каких людей день рождения в текущий день, через файл Excel. Однако, когда именинников больше одного, он показывает сразу несколько тостов, один поверх другого. Мне нужен был способ подождать, пока тост исчезнет, ​​чтобы показать следующий

Arquivo arquivo = new Arquivo();
ObservableList<String> listaDatas = arquivo.pegarListaString(1, 8); //take people's birthday dates
String data = Agenda.dateParaString(LocalDate.now()).substring(0, 5); //today's day
String data2 = Agenda.dateParaString(LocalDate.now().plusDays(1)).substring(0, 5); //tomorrow
int index = 0;
for(String valor: listaDatas) {
    if (valor.length() > 4) {
        if (valor.substring(0, 5).equalsIgnoreCase(data)) {
            Agenda.mostrarToastTexto("Hoje é aniversário de " + arquivo.pegarValor(1, index, 0), 2000); 
        } else if(valor.substring(0, 5).equalsIgnoreCase(data2)) {
            Agenda.mostrarToastTexto("Amanhã é aniversário de " + arquivo.pegarValor(1, index, 0) , 2000);
        }
    }
    index++;
}

Я уже пытался использовать «Thread.sleep», а также класс Timer, но безрезультатно.


person Death Awaits    schedule 12.06.2018    source источник


Ответы (1)


Вот один из подходов с использованием кода из здесь.

Этот код использует Timeline для отображения нового имени каждые две секунды.

import com.jfoenix.controls.JFXSnackbar;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Duration;

/**
 *
 * @author blj0011
 */
public class JavaFXApplication207 extends Application
{

    @Override
    public void start(Stage primaryStage)
    {
        StackPane root = new StackPane();

        JFXSnackbar snackbar = new JFXSnackbar(root);

        List<String> listaDatas = new ArrayList();
        listaDatas.add("Kim");
        listaDatas.add("John");
        listaDatas.add("Chris");

        AtomicInteger counter = new AtomicInteger();
        Timeline threeSecondsWonder= new Timeline(new KeyFrame(Duration.seconds(3), new EventHandler<ActionEvent>()
        {
            @Override
            public void handle(ActionEvent event)
            {
                snackbar.show("Happy birthday " + listaDatas.get(counter.getAndIncrement()) + "!", 2000);
            }
        }));

        threeSecondsWonder.setCycleCount(listaDatas.size());
        threeSecondsWonder.play();

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        launch(args);
    }

}

Обновление: использование JFXSnackbar в ответе.

person Sedrick    schedule 12.06.2018
comment
Это сработало отлично, спасибо! Мне только пришлось сделать небольшую адаптацию, потому что когда у человека не было дня рождения, он точно так же ожидал 3 секунды, поэтому в записи с 1000 человек, где день рождения только один, он ждал 3000 секунд, прежде чем показать тост - person Death Awaits; 12.06.2018