【java】java实现钟摆,可控制摆动的速度

来源:互联网 发布:淘宝上怎么买衣服 编辑:程序博客网 时间:2024/05/16 01:02


java实现中摆的方式比较简单,但是我开始做的时候没有接触过动画,将种摆的模型画出来是很简单的,但是让它动起来是有一定难度的。


代码如下:

import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Test extends JFrame {  private KeyboardPanel keyboardPanel = new KeyboardPanel();  /** Initialize UI */  public Test() {    // Add the keyboard panel to accept and display user input    add(keyboardPanel);    // Set focus    keyboardPanel.setFocusable(true);  }  /** Main method */  public static void main(String[] args) {    Test frame = new Test();    frame.setTitle("回文摆");frame.setSize(300, 300);frame.setLocationRelativeTo(null);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);  }  // Inner class: KeyboardPanel for receiving key input  static class KeyboardPanel extends JPanel {  private int x1 = 150;  private int y1 = 20;  private int x2 = 150;  private int y2 = 220;    int leftAngle = 120;  int rightAngle = 60;  int angle = leftAngle; // Start from leftAngle  int angleDelta = 1; // Swing interval    int delay = 100;    Timer timer = new Timer(delay, new ActionListener() {      public void actionPerformed(ActionEvent e) {        repaint();      }    });    public KeyboardPanel() {    timer.start();          addKeyListener(new KeyAdapter() {        public void keyPressed(KeyEvent e) {                  switch (e.getKeyCode()) {          case KeyEvent.VK_DOWN: delay += 20; break;          case KeyEvent.VK_UP: delay -= 20; break;          case KeyEvent.VK_S: timer.stop(); break;          case KeyEvent.VK_R: timer.start(); break;          }           if (delay < 0) delay = 10; // delay不能为负                    timer.setDelay(delay);        }      });      setFocusable(true);    }    protected void paintComponent(Graphics g) {      super.paintComponent(g);  if (angle < rightAngle)        angleDelta = 1; // 从左开始摆动  else if (angle > leftAngle)        angleDelta = -1; // 从右开始摆动                  angle += angleDelta;  String Message = "当前延迟:"+delay+" ms";  g.drawString(Message, 10, 20);  g.drawLine(x1, y1, x2, y2);  g.setColor(Color.BLACK);  g.fillOval(x2-10, y2, 20, 20);     double length = 200;  x2 = x1 + (int)(length * Math.cos(Math.toRadians(angle)));  y2 = y1 + (int)(length * Math.sin(Math.toRadians(angle)));    }  }}


读者可以自己试试。


10 0
原创粉丝点击