2012-11-27 90 views
0

我有一個動畫,我想加快速度和減慢按鈕單擊。 我環顧四周,找不到解決方案。目前,我有一個actionlistener用於更改延遲變量值並重新啓動計時器的按鈕。java定時器更改延遲按鈕

任何人都可以請指教。 謝謝

回答

2

而不是改變計時器,動畫的其他部分可能依賴的定時器,我會改變對象的速度。

這是很小的主觀。我的例子有一個對象能夠在同一時間段內改變速度。實際上,您可能需要更改動畫的播放時間,而這需要更改時間。這帶來了其他問題。

實現此目的的一種方法是,實際上有一個定時器以定期間隔滴答滴答並且對這些滴答作出反應的模型。這意味着如果您調整持續時間,心跳將不會受到影響,您只需通過動畫調整距離即可。這是怎樣的Timing Framework作品,我相信Trident遵循類似的設計

enter image description here

public class TestAnimationSpeed { 

    public static void main(String[] args) { 
     new TestAnimationSpeed(); 
    } 

    public TestAnimationSpeed() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new AnimationPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class AnimationPane extends JPanel { 

     private JSlider slider; 
     private BouncyPane bouncyPane; 

     public AnimationPane() { 
      setLayout(new BorderLayout()); 
      bouncyPane = new BouncyPane(); 
      add(bouncyPane, BorderLayout.CENTER); 
      slider = new JSlider(1, 11); 
      slider.setMajorTickSpacing(2); 
      slider.setPaintTicks(true); 
      add(slider, BorderLayout.SOUTH); 
      slider.addChangeListener(new ChangeListener() { 
       @Override 
       public void stateChanged(ChangeEvent e) { 
        bouncyPane.setVerticalSpeed(slider.getValue()); 
       } 
      }); 
      slider.setValue(4); 
     } 

    } 

    public class BouncyPane extends JPanel { 

     private int dy = 4; 
     private Ellipse2D ball; 

     public BouncyPane() { 
      ball = new Ellipse2D.Float(100, 0, 10, 10); 
      Timer timer = new Timer(1000/60, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        double y = ball.getY(); 
        y += dy; 
        if (y + ball.getHeight() > getHeight()) { 
         y = getHeight() - ball.getHeight(); 
         dy *= -1; 
        } else if (y < 0) { 
         y = 0; 
         dy *= -1; 
        } 
        ball.setFrame(ball.getX(), y, ball.getWidth(), ball.getHeight()); 
        repaint(); 
       } 
      }); 
      timer.setRepeats(true); 
      timer.setCoalesce(true); 
      timer.start(); 
     } 

     public void setVerticalSpeed(int speed) { 
      if (dy < 0 && speed > 0) { 
       dy = -speed; 
      } else { 
       dy = speed; 
      } 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setColor(Color.RED); 
      g2d.fill(ball); 
     } 

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

    } 

}