tiempo - demora de cambio de temporizador java con botón
timer java example (1)
En lugar de cambiar el temporizador, en el que pueden confiar otras partes de la animación, cambiaría la velocidad del objeto.
Esto es poco subjetivo. Mi ejemplo tiene un objeto capaz de cambiar las velocidades en el mismo período de tiempo. En realidad, se le puede solicitar que modifique el tiempo de reproducción de la animación, lo que requerirá un cambio en el tiempo. Esto trae a colación otros problemas.
Una forma de lograr esto es tener un temporizador que funcione a intervalos regulares y un modelo que reaccione a esos tics. Esto significa que si ajustas la duración, el latido del corazón no se verá afectado, solo necesitarás ajustar la distancia a través de la animación. Así es como funciona el Timing Framework y creo que Trident sigue un diseño similar
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);
}
}
}
Tengo una animación que me gustaría acelerar y ralentizar con un clic de botón. He buscado mucho y no puedo encontrar una solución. Actualmente tengo un actionlistener para el botón que cambia el valor de la variable de retardo y reinicia el temporizador.
¿Alguien puede por favor asesorar? Gracias