[英]How do I make a Timer ActionListener wait for another one to stop before starting
我正在嘗試制作一個Serpents and Ladders java應用程序,我想讓jLabels移動動畫。 我希望玩家能夠水平移動然后垂直移動,但是當我這樣做時,它們同時發生。 如何使第二個計時器(垂直)等待水平停止。 這是簡化的代碼。
private void mover(javax.swing.JLabel label,boolean inv,boolean y){
ActionListener a = new ActionListener() {
int timesq = 40;
int delta = 1;
int deltax = 0;
@Override
public void actionPerformed(ActionEvent e) {
if (inv){
delta = -1;
}
if (y){
deltax = 1;
}
int x = label.getX() + delta;
int y = label.getY() + deltax;
label.setLocation(x, y);
label.setText(String.valueOf(x));
repaint();
if (--timesq <= 0){
Timer timer = (Timer)e.getSource();
timer.stop();
}
}
};
Timer timer = new Timer(20,a);
timer.start();
}
以及觸發移動的按鈕
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
setLayout(null);
jLabel1.setSize(jLabel1.getPreferredSize());
//add(jLabel1);
//Horizontal movement
int b = 5;
while(b!=0){
mover(jLabel1,false,false);
b--;
}
//Vertical movement
b = 2;
while(b!=0){
mover(jLabel1,false,true);
b--;
}
}
X方向移動完成后,您需要在Y方向移動:
private void mover(JLabel label,boolean inv,boolean y){
final int delta = inv ? -1 :1 , deltax = y ? 1: 0, timesq = 40;
ActionListener moveX = new ActionListener() {
int counterX = timesq, counterY = timesq;
@Override
public void actionPerformed(ActionEvent e) {
if(--counterX > 0){ //move at x direction
int x = label.getX() + delta;
label.setLocation(x, label.getY());
label.setText(String.valueOf(x));
}else if(--counterY > 0){ //move at y direction
int y1 = label.getY() + deltax;
label.setLocation(label.getX(), y1);
label.setText(String.valueOf(y1));
}else{
Timer timer = (Timer)e.getSource();
timer.stop();
}
repaint();
}
};
Timer timer = new Timer(20,moveX);
timer.start();
}
(復制 - 粘貼 - 從這里運行完整的測試代碼)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.