Java_小球的运动

java gui编程实现运动的小球

要求

编写一个Java动画程序,要求采用多个线程控制不同图形分别做运动

参考

代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Objects;

public class test3_5 {
  public static void main(String[] args) {
    // 新建主程序窗口
    new MainWin("");
  }
}

class MainWin extends JFrame implements ActionListener {
  // 主界面
  private static final long serialVersionUID = 1L;
  JButton start1, start2;
  MyPanel panel;
  JPanel buttonPanel;

  MainWin(String name) {
    // 主界面JFrame的构造函数
    super(name);
    init();
    panel = new MyPanel(this); // 把主窗口frame传进去(需要获取窗口的大小)

    buttonPanel = new JPanel();// 用来放两个按钮
    start1 = new JButton("Oval加速");
    start1.addActionListener(this);// 按钮添加监听器
    start2 = new JButton("Rect加速");
    start2.addActionListener(this);
    buttonPanel.add(start1);
    buttonPanel.add(start2);
    this.add(panel, BorderLayout.CENTER);
    this.add(buttonPanel, BorderLayout.SOUTH);
  }

  void init() {
    setLocationRelativeTo(null);
    setSize(400, 160);
    setVisible(true);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    validate();
  }

  @Override
  public void actionPerformed(ActionEvent e) {
    String actionString = e.getActionCommand();
    if (Objects.equals(actionString, "Oval加速")) {
      panel.startT1();
    } else if (Objects.equals(actionString, "Rect加速")) {
      panel.startT2();
    }
  }
}

class MyPanel extends JPanel {

  private static final long serialVersionUID = 5640668174921441140L;
  JFrame frame;

  boolean right1 = true, right2 = true;

  int x1 = 0, y1 = 0;// Oval的位置和运动方向
  int x2 = 0, y2 = 80;// Rect的位置和运动方向

  int r = 20;// Oval的大小
  int a = 20, b = 20;// Rect的大小

  MyPanel(MainWin frame) {
    super();
    this.frame = frame;
  }

  @Override
  // 这里画画
  public void paint(Graphics g) {
    super.paint(g);
    // 画个圆形
    g.setColor(Color.black);
    g.fillOval(x1, y1, r, r);
    // 画个方形
    g.setColor(Color.green);
    g.fillRect(x2, y2, a, b);
  }

  public void startT1() {
    // Oval的线程
    Thread moveUpOval = new Thread() {
      @Override
      public void run() {
        while (true) {
          if (right1) {
            if (x1 == (frame.getWidth() - a)) {
              right1 = false;
            } else {
              x1++;
            }
            repaint();
            try {
              sleep(30);
            } catch (InterruptedException e) {
              e.printStackTrace();
            }
          } else {
            if (x1 == 0) {
              right1 = true;
            } else {
              x1--;
            }
            repaint();
            try {
              sleep(30);
            } catch (InterruptedException e) {
              e.printStackTrace();
            }
          }
        }
      }
    };
    moveUpOval.start();
  }

  public void startT2() {
    // Rect的线程控制
    Thread moveUpRect = new Thread() {
      @Override
      public void run() {
        while (true) {
          if (right2) {
            if (x2 == (frame.getWidth() - 2 * r)) {
              right2 = false;
            } else {
              x2++;
            }
            repaint();// 更新了位置后,重新画
            try {
              sleep(30);
            } catch (InterruptedException e) {
              e.printStackTrace();
            }
          } else {
            if (x2 == 0) {
              right2 = true;
            } else {
              x2--;
            }
            repaint();
            try {
              sleep(30);
            } catch (InterruptedException e) {
              e.printStackTrace();
            }
          }
        }

      }
    };
    moveUpRect.start();
  }
}

Leave a Comment

您的电子邮箱地址不会被公开。 必填项已用 * 标注