버튼을 클릭하여 속도를 높이고 속도를 낮추고 싶은 애니메이션이 있습니다. 저는 꽤 많이 둘러 보았고 해결책을 찾지 못했습니다. 현재 지연 변수의 값을 변경하고 타이머를 다시 시작하는 버튼에 대한 actionlistener가 있습니다.버튼으로 Java 타이머 변경 지연
누구든지 조언 해 주실 수 있습니까? 감사합니다
버튼을 클릭하여 속도를 높이고 속도를 낮추고 싶은 애니메이션이 있습니다. 저는 꽤 많이 둘러 보았고 해결책을 찾지 못했습니다. 현재 지연 변수의 값을 변경하고 타이머를 다시 시작하는 버튼에 대한 actionlistener가 있습니다.버튼으로 Java 타이머 변경 지연
누구든지 조언 해 주실 수 있습니까? 감사합니다
애니메이션의 다른 부분에 의존하는 타이머를 변경하면 객체의 속도가 변경됩니다.
이것은 주관적이지 않습니다. 내 예제에는 동일한 시간대에 속도를 변경할 수있는 객체가 있습니다. 대신 실제로 애니메이션이 재생되는 시간을 변경해야 할 수도 있습니다. 시간이 변경되어야합니다. 이것은 다른 문제를 제기합니다.
이것을 달성하는 한 가지 방법은 실제로 일정한 간격으로 틱하는 타이머와 해당 틱에 반응하는 모델을 만드는 것입니다. 즉, 길이를 조정하면 심장 박동이 영향을 미치지 않으므로 애니메이션을 통해 거리를 조정하면됩니다. 이 방법 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);
}
}
}