2014-01-23 5 views
0

Я использую таймер Swing для выполнения анимаций в моей программе. Во многих случаях существует несколько разных вызовов, сделанных для метода animate(), с отдельным таймером, созданным для каждого. Я знаю, что из-за того, как разработаны таймеры Swing, все они выполняются вместе - все мои анимации происходят одновременно. Однако есть несколько случаев, когда мне нужно дождаться завершения одной анимации, чтобы выполнить другую.Последовательное выполнение таймера качания

Есть ли способ заставить таймеры Swing выполнять последовательно - один за другим, а не все сразу? Или есть альтернативный механизм таймера Swing, который может лучше соответствовать моему варианту использования?

EDIT: Боюсь, я немного упростил свой прецедент. Предложение @ peeskillet будет работать отлично, если бы я знал при каждом «смене сцены», какие анимации нужно будет исполнять, или если одна и та же последовательность анимаций происходит каждый раз. К сожалению, это не тот случай - для каждого перехода требуется другой набор анимаций, с разными наборами компонентов, перемещающимися на панели и вокруг них.

Что я хочу - сначала выполнить анимацию элементов с экрана, а затем (после этого) оживить компоненты на экране. Не сложно различать эти «типы» анимаций во время выполнения - они инициируются из разных методов, и поэтому легко представить их, добавляя их к двум различным «очередям» - очередь исходящих элементов и очередь входящих элементов , Сделав это, я смог бы реализовать основную стратегию вызова

Это сказало - все это имеет смысл только для меня интуитивно, эвристически - я не понял, как реализовать его на практике. Какими были бы эти «очереди», и какой класс будет удерживать, а затем выполнять их? Предположительно, тот, который реализует Runnable, создавая второй поток, который может выполнять анимацию с более жестким контролем над тем, как они работают? Или поток событий-отправки дает мне достаточный контроль здесь, если только я полностью понял, как его использовать? В этом случае - пожалуйста, помогите мне сделать это.

(PS Я понимаю, что я изменил вопрос значительно здесь, по существу, превращая его в новый вопрос, и что @peetskillet ответил, как ранее сформулированный отлично, поэтому я принял этот ответ и отправил новый вопрос here.

+0

Вам просто нужно завершение одного запуска таймера следующего. Нет встроенного механизма. – Gene

+0

@ Gene- Что делать, если таймеры являются динамическими и не могут проверяться вручную. – mmathan

ответ

2

«есть ли способ, чтобы сделать распашные таймеры выполняют последовательно - один за другим, а не все сразу»

Просто используйте `булево какой-то, говоря, когда первый таймер, когда он должен остановиться и когда начнется второй таймер. Что-то вроде

Timer timer1 = new Timer(delay, null);  <---- initialize 
Timer timer2 = new Timer(delay, null); 
boolean something = false; 

public Constructor() { 
    timer1 = new Timer(delay, new Action Listener(){ 
     public void actionPerformed(ActionEvent e) { 
      if (something) {    ------ 
       timer2.start();     | 
       timer1.stop();     |---- some code should lead to 
      } esle {       |  `something` being true. Maybe 
       animateFirstSomething();  |  another if statement inside the 
      }         |  else. Like if x equals y 
     }         ------  something = true, else, 
    });            animateFirstSomething() 
    timer1.start(); 

    timer2 = new Timer(delay, new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
      animationSecondSomething(); 
     } 
    }); 
} 

Вот простой пример

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 

public class TestTwoTimers extends JPanel { 

    int rectOneX = 0; 
    int rectTwoX = 0; 

    Timer timer1 = new Timer(100, null); 
    Timer timer2 = new Timer(100, null); 
    boolean rectOneGo = true; 



    public TestTwoTimers() { 
     timer1 = new Timer(100, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (rectOneGo) { 
        if (rectOneX >= 225) { 
         timer2.start(); 
         timer1.stop(); 
        } else { 
         rectOneX += 10; 
         repaint(); 
        } 
       } 
      } 
     }); 
     timer2 = new Timer(100, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (rectTwoX < 225) { 
        rectTwoX += 10; 
        repaint(); 
       } else { 
        timer2.stop(); 
       } 
      } 
     }); 

     final JButton button = new JButton("Start First Timer"); 
     button.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       timer1.start(); 
      } 
     }); 

     setLayout(new BorderLayout()); 
     add(button, BorderLayout.PAGE_END); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(300, 300); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     g.setColor(Color.red); 
     g.fillRect(rectOneX, 50, 75, 75); 

     g.setColor(Color.BLUE); 
     g.fillRect(rectTwoX, 150, 75, 75); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() { 
       JFrame frame = new JFrame("Double Timers"); 
       frame.add(new TestTwoTimers()); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

почему два или более таймера, может быть, нет причин, поместите [каждый объект в один массив, затем просто зациклируйте внутри ...] (http://stackoverflow.com/questions/8614972/passing-current-date) – mKorbel

+0

@mKorbel Я не знаю, я просто отвечаю на конкретный вопрос OP. Я бы использовал структуру данных. :) –

+0

@peeskillet спасибо, см. Мой ответ в обновлении к моему сообщению – drewmoore

Смежные вопросы