Java_小球的运动
2020年11月13日下午10:01
2020年11月21日下午9:58
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();
}
}