Задержка между строками в Java

Я создаю карточную игру на Java и хочу изобразить вид раздачи. Я создал JLabels, и я делаю их видимыми с помощью .setVisible (true) и хотел бы установить задержку между отображением каждой карты. Я пробовал использовать wait () и Thread.sleep (), но ни один из них не работал. wait () выдает ошибки, а Thread.sleep просто приостанавливает всю программу, а не только каждое появление. (Этот код запускается при нажатии кнопки «Далее», поэтому он находится в методе actionPerformed)

Примечание: я новичок ... пожалуйста, будьте проще :)

else if (eventName.equals("Next"))
  {
     rules.setVisible(false);
     next.setVisible(false);
     inst.setVisible(false);
     cardDeck.setVisible(true);
     discard.setVisible(true);
     tot.setVisible(true);
     specialCards.setVisible(true);
     // delay here
     userCard1.setVisible(true);
     // delay here
     compCard1.setVisible(true);
     // delay here
     userCard2.setVisible(true);
     // delay here
     compCard2.setVisible(true);
     // delay here
     userCard3.setVisible(true);
     // delay here
     compCard3.setVisible(true);
  }  

вы должны анимировать каждый вид

Chisko 11.06.2018 00:56

это в конечном итоге выполняется в потоке событий? например в ActionListener, например здесь

user85421 11.06.2018 01:09

Это не в слушателе действия, а в методе actionPerformed

Rachel Sousa 11.06.2018 01:13

и это не используется как actionPerformed, определенный в интерфейсе ActionListener ???

user85421 11.06.2018 01:15

да вообще ... игнорировать последний комментарий упс

Rachel Sousa 11.06.2018 01:18

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

user85421 11.06.2018 01:20

и почти все классы Swing должны иметь ссылку на политику потоковой передачи Swing - это неплохо, если вы работаете с Swing.

user85421 11.06.2018 01:23

Re: «Это не в прослушивателе действий, а в методе actionPerformed» На экране ничего не изменится, и ваша программа не сможет ответить на любой ввод пользователя, пока этот обработчик actionPerformed () не вернется. Вместо этого сделайте то, что сказал @MichaelBeer: используйте таймер.

Solomon Slow 11.06.2018 01:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
8
127
1

Ответы 1

Используйте Таймеры, чтобы метки отображались через некоторое время. В документации вы увидите, что использовать их действительно просто.

Вы также можете просто вставить код, который приостанавливает ваше приложение на определенное время, например Thread.sleep, но это приведет к тому, что ваше приложение полностью перестанет отвечать, пока приложение ожидает.

Простой пример:

package testTimer;

import java.awt.Component;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;

public class TimerTest extends JFrame {

    // These labels will be shown after some delay
    JLabel l1 = null;
    JLabel l2 = null;

    public TimerTest() {

        Container cpane = getContentPane();
        cpane.setLayout(new BoxLayout(cpane, BoxLayout.Y_AXIS));
        JLabel l = new JLabel("Timer Test");
        l.setAlignmentX(Component.CENTER_ALIGNMENT);
        cpane.add(l);
        l.setVisible(true);
        l1 = new JLabel("1");
        l2 = new JLabel("2");
        cpane.add(l1);
        l1.setVisible(false);
        cpane.add(l2);
        l2.setVisible(false);

        // Now prepare two timers, one for each label
        int delayForL1Millis = 1000;
        Timer t1 = new Timer(delayForL1Millis, new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                l1.setVisible(true);
            }
        });
        t1.setRepeats(false);

        int delayForL2Millis = 2000;
        Timer t2 = new Timer(delayForL2Millis, new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                l2.setVisible(true);
            };
        });
        t2.setRepeats(false);

        // And start them
        t1.start();
        t1 = null;
        t2.start();
        t2 = null;

    }

    public static void main(String[] argv) {

        TimerTest timertest = new TimerTest();
        timertest.setVisible(true);

    }

}

Я пробовал это, но не мог понять, как с этим работать

Rachel Sousa 11.06.2018 00:50

Я добавил пример того, как использовать таймеры для отображения отложенных ярлыков ...

Michael Beer 11.06.2018 01:34

Другие вопросы по теме