Я создаю карточную игру на 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);
}
это в конечном итоге выполняется в потоке событий? например в ActionListener, например здесь
Это не в слушателе действия, а в методе actionPerformed
и это не используется как actionPerformed, определенный в интерфейсе ActionListener ???
да вообще ... игнорировать последний комментарий упс
ну, вам не следует использовать спящий режим (блок) в потоке отправки событий - это блокирует графический интерфейс, то есть никаких обновлений ... попробуйте SwingWorker (поиск в StackOverflow, это хорошо известная проблема ... но уже слишком поздно для мне искать его сейчас, извините)
и почти все классы Swing должны иметь ссылку на политику потоковой передачи Swing - это неплохо, если вы работаете с Swing.
Re: «Это не в прослушивателе действий, а в методе actionPerformed» На экране ничего не изменится, и ваша программа не сможет ответить на любой ввод пользователя, пока этот обработчик actionPerformed () не вернется. Вместо этого сделайте то, что сказал @MichaelBeer: используйте таймер.




Используйте Таймеры, чтобы метки отображались через некоторое время. В документации вы увидите, что использовать их действительно просто.
Вы также можете просто вставить код, который приостанавливает ваше приложение на определенное время, например 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);
}
}
Я пробовал это, но не мог понять, как с этим работать
Я добавил пример того, как использовать таймеры для отображения отложенных ярлыков ...
вы должны анимировать каждый вид