package test3;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Random;
public class mycir extends Frame implements ActionListener,Runnable{
Graphics g;
Thread circle=null; //声明一个线程对象
public void init(){
circle = new Thread(this);
g = getGraphics();
circle.start(); // 启动线程
}
public void setG(Graphics g) {
this.g = g;
}
public mycir()
{
super("画图");
setSize(800,600);
setLocationRelativeTo(null);//画布居中显示
setLayout(new FlowLayout());
Button btn = new Button("清空");
add(btn);
btn.addActionListener(this);
setVisible(true);
}
public void paint(Graphics g)//画图对象
{
super.paint(g);
Random rand =new Random();
int x0=(int)(Math.random()*800);
int y0=(int)(Math.random()*600);//圆心
int r=rand.nextInt(5)+25;
g.drawOval(x0,y0,r,r);
g.fillOval(x0,y0,r,r); //填充圆
}
public void actionPerformed(ActionEvent e)
{
if(e.getActionCommand().equals("清空"))
{
dispose();
mycir D = new mycir();
D.setBackground(Color.white);
}
}
public void run() {
while(true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
paint(g);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f = new mycir();
mycir mt=new mycir();
Thread thr=new Thread(mt);
thr.start();
}
class closeWin extends WindowAdapter {
public void windowClosing(WindowEvent e)
{
Window w=e.getWindow();
w.dispose();
}
}
}
我的清空也显示不出来,repaint不太会用,选择新建一个窗口重绘,但并没有关闭之前的窗口
在您的代码中,您创建了两个 mycir 对象,并为每个对象创建了一个线程。这意味着您的应用程序中实际上有两个线程同时运行,并且它们绘制的图形可能会重叠,导致您只看到一个圆。
解决此问题的一种方法是,只创建一个 mycir 对象和一个线程,并在 run() 方法中使用 repaint() 方法来重新绘制图形。另外,您的 init() 方法中的 g = getGraphics() 不是一个好习惯,因为它不保证您将获得一个持久的 Graphics 对象。相反,您应该在 paint() 方法中使用传递给它的 Graphics 对象来绘制图形。