JavaFX: Gif и пауза

215
20 сентября 2018, 16:40

Идея такая: есть скрытая GIF'ка. при нажатии на кнопку, она становится видимой, пауза в пару секунд, GIF'ка опять становится невидимой и происходит изменения в окне. Пытался это сделать - во время паузы не работает гиф (не видно, что она появляется и исчезает). решил сделать через поток след образом:

    shar_img_gif.setVisible(true);
    Thread s1 = new Thread(new Runnable(){
        public void run(){
            try {
                Thread.sleep(1000);
                shar_img_gif.setVisible(false);
                int i = (int)(Math.random()*o.x);
                shar_otv1.setText(o.otv[i]);
                shar_vopros.setText(shar_text.getText()+"?");
                shar_text.setText(null);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });
    s1.start();

но начинает ругаться на 2 эти строки:

shar_otv1.setText(o.otv[i]);
shar_vopros.setText(shar_text.getText()+"?");

если вынести их за пределы потока - все будет работать, но не так как надо (выполняется сразу, а надо чтобы этот кусок работал после паузы, когда GIF'ка исчезнет).

эти 2 строки не хотят работать просто в потоке. как это исправить? и почему так происходит?

Answer 1

Используйте Timer:

shar_img_gif.setVisible(true);
javax.swing.Timer timer = new javax.swing.Timer(1000/*Time in millis*/,e->
{
    Platform.runLater(()->
    {
        shar_img_gif.setVisible(false);
        int i = (int)(Math.random()*o.x);
        shar_otv1.setText(o.otv[i]);
        shar_vopros.setText(shar_text.getText()+"?");
        shar_text.setText(null);
    }/*Runnable*/);
}/*ActionListener*/);
timer.setRepeats(false);
timer.start();

Исключение появляется так, как работа с JavaFX должна проиводиться в JavaFX потоке, для этого нужно использовать

Platform.runLater(()->
{
    //Your code there
});

()->{} - это лямбда выражение, добавленное в java 8, оно заменяет new Runnable(){}

READ ALSO
PreDestroy аннотация, сравнение с finalise()

PreDestroy аннотация, сравнение с finalise()

Является ли использование, @PreDestroy плохой практикой(как с finalize)?

204
Как работает нормализация Java (normalize)

Как работает нормализация Java (normalize)

Есть такой код, который создает дерево DOM из файла FILE_NAME, а метод writeFileXML() записывает изменения в файл:

237
rmiregistry не запускается на localhost

rmiregistry не запускается на localhost

Есть специализированное приложение на java, которое не запускается под ubuntuПри запуске выдает, что не может соединится с rmiregistry

270