用Java实现多线程画图
目录
- 功能分析
- 初步实现
- 添加监听器
- 创建多线程
- 实现多线程画图
1,功能分析
这个程序的基本思路就是:展示一个JFrame界面,给JFrame添加我们自己实现的鼠标事件监听器,记录鼠标事件点击时鼠标所在坐标;JFrame类提供了一个getGraphics()方法可以得到java.awt.Graphics对象,Graphics可以理解为“画布”对象,通过调用Graphics对象不同的Draw方法并传入鼠标的坐标参数,就可以在JFrame界面上画出相应的图形;最后,利用Runnable接口为程序添加多线程。
2,初步实现
package 画球;
import java.awt.Graphics;
import javax.swing.*;
public class Draw {
public static void main(String[] args) {
Draw d = new Draw();
d.showUI();
}
public void showUI(){
JFrame jf = new JFrame();
jf.setTitle("画板");
jf.setSize(800, 500);
jf.setResizable(false);
jf.setDefaultCloseOperation(3);
jf.setVisible(true);
Graphics g = jf.getGraphics();
}
}
3,添加监听器
创建一个新的类DrawListener用于写监听器,这里用的是鼠标事件监听器,可以在查看鼠标事件监听器的声明
我们这里重写鼠标事件监听器的mouseReased方法,当鼠标松开时,在当前位置画一个圆。
package 画球;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
public class DrawListener implements MouseListener{
public int x1,x2,y1,y2;
public int pre=0,now=1;
private Graphics g;
public boolean f = false;
public DrawListener(Graphics g){
this.g = g;
}
public void mouseClicked(MouseEvent e){
}
public void mousePressed(MouseEvent e){
}
public void mouseReleased(MouseEvent e){
x1 = e.getX();
y1 = e.getY();
g.fillOval(x1-25, y1-25, 50, 50);
}
public void mouseEntered(MouseEvent e){
}
public void mouseExited(MouseEvent e){
}
}
4,创建多线程
需要注意的是要将Graphics和坐标传进来
package 画球;
import java.awt.Graphics;
public class Run implements Runnable {
private Graphics g;
public int x1, y1;
public Run(Graphics g, int x1, int y1) {
this.g = g;
this.x1 = x1;
this.y1 = y1;
}
public void run() {
int i = 0;
while (true) {
g.fillOval(x1 - 25 + i, y1 - 25, 50, 50);
try {
Thread.sleep(40);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
i++;
}
}
}
最后在监听器的mouseReased方法中创建多线程并在主程序中添加监听器
Run r = new Run(g,x1,y1);
new Thread(r,"1").start();
DrawListener dl = new DrawListener(g);
jf.addMouseListener(dl);
5,实现多线程画图
运行程序
随便点击几个点,出现同时运行的线程