java计时器更改延迟按钮

我有一个动画,我想通过点击按钮来加速和减速。 我环顾四周,无法找到解决方案。 目前我有一个用于按钮的actionlistener,用于更改延迟变量的值并重新启动计时器。

任何人都可以请指教。 谢谢

而不是更改动画的其他部分可能依赖的计时器,我会改变对象的速度。

这不是主观的。 我的例子有一个能够在同一时间段内改变速度的物体。 实际上,您可能需要更改动画播放的时间,这需要更改时间。 这带来了其他问题。

实现这一目标的一种方法是,实际上有一个定时滴答的计时器和一个对这些滴答作出反应的模型。 这意味着如果您调整持续时间,心跳不会受到影响,您只需要通过动画调整距离。 这就是Timing Framework的工作方式,我相信Trident遵循类似的设计

在此处输入图像描述

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