【问题标题】:How do I make a Timer ActionListener wait for another one to stop before starting如何让 Timer ActionListener 在启动前等待另一个停止
【发布时间】:2019-04-04 09:36:06
【问题描述】:

我正在尝试制作一个 Serpents 和 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--;
        }


}

【问题讨论】:

  • 您只需从第一个计时器停止的地方开始第二个计时器。
  • 是的,一旦您到达您的对象的首选位置,只需停止第一个计时器并启动另一个计时器。

标签: java swing animation timer


【解决方案1】:

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();
}

(从here复制粘贴运行完整的测试代码)

【讨论】:

    猜你喜欢
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 2018-03-12
    相关资源
    最近更新 更多