JAVA基础-线程小球

文章描述了一个Java程序,通过一个线程控制30个小球在用户界面上进行随机直线运动,小球具有随机大小、速度和颜色。当点击界面时,会在点击位置生成新的小球,直到达到30个。程序利用监听器处理鼠标点击事件,创建小球对象并存储在数组中,线程则负责从小球数组中取出小球进行绘制和运动更新,包括边界回弹效果。
摘要由CSDN通过智能技术生成

主要实现由一个线程控制30个小球运动,最终效果是每点击一次界面,都会在该位置生成随机大小的小球,小球以随即速度做直线运动(会回弹),生成30个小球后不能再点击。效果如下:

首先创建一个小球类,包括坐标,速度,大小,颜色等属性

public class ball {
    int x,y,speed,size;
    Graphics g;
    Color color;
    JFrame jf;
    public ball(int x,int y,Graphics g,Color color,int speed,int size){
        this.x=x;
        this.y=y;
        this.g=g;
        this.color=color;
        this.speed=speed;
        this.size=size;
    }
}

第二步:建立窗体对象,在窗体上加上监听器

public class ThreadGame extends JFrame{
    static Graphics g;
    GameListener gl = new GameListener ();
    public void showUI(){
        JFrame jf=new JFrame("");
        jf.setTitle ("线程游戏");
        jf.setSize (800,800);       
        jf.setDefaultCloseOperation (EXIT_ON_CLOSE);
        jf.getContentPane().setBackground(Color.WHITE);
        jf.setVisible (true);
        jf.addMouseListener (gl);
        g=jf.getGraphics();
        gl.setG(g);
        gl.setJf(jf);
    }
    @Override
    public void paint(Graphics g){
        super.paint (g);
    }
    public static void main(String[] args) {
        ThreadGame th=new ThreadGame();
        th.showUI();    
    }
}

第三步:创建监听器类,主要监听鼠标动作,按下时获取坐标并创建小球对象,这里是初始化一个动态数组,调用add()方法将创建的小球对象加入数组中,在后面线程类中会从数组中取出小球并绘制。

保证只用一个线程而不再重复创建线程的方法是设置一个布尔变量,初始值为true,当创建并启动线程后,变量赋值为false,之后每次点击鼠标都是将小球add到数组中,而不再创建线程。

public class GameListener extends MouseAdapter{

ArrayList<ball> list=new ArrayList<ball>();
Graphics g;
JFrame jf;
int count=1;
public boolean startThread=true;//判断线程是否启动

    public void setG(Graphics g) {
            this.g=g;
        }
    public void setJf(JFrame jf) {
            this.jf=jf;
        }
     @Override
     public void mouseReleased(MouseEvent e){
            System.out.println("点击了"+count+"次");
            count++;
             int x ,y=0;
            Random r=new Random();
            x=r.nextInt(700);
            y=r.nextInt(700);
            Color color=Color.BLACK;
            //实例化小球,输入参数:坐标,画笔,颜色,小球移动速度,小球大小
            ball ball=new ball(x,y,g,color,r.nextInt(1,10),r.nextInt(1,50));
            //将小球添加到数组
            list.add(ball);                        
            //保证只调用一次start方法
            if(startThread) {
                //启动线程
                MainThread mt=new MainThread(list,g,jf);
                new Thread(mt).start();
                System.out.print("线程启动。。");
                startThread=false;
            } 
            
        }

}

第四步:创建线程类,使用runnable接口实现线程,重写run方法,从数组中取出小球,判断小球是否运动出界面,并且要画一个白球盖住上一个小球,再绘制当前小球。

public class MainThread implements Runnable{

    ArrayList<ball> list=new ArrayList<ball>();
    Graphics g;
    JFrame jf;

    public MainThread(ArrayList<ball> list,Graphics g,JFrame jf){
        this.list=list;    
        this.g=g;
        this.jf=jf;
        }
    @Override
    public void run() {
        //第一个循环控制线程运行时间,要求一个线程控制30个小球
        while(list.size()<=30) {
            //画出小球
            for(int i=0;i<list.size();i++) {
                //超出窗体回弹
                if(list.get(i).y<0||list.get(i).y>jf.getHeight()+10||list.get(i).x<0||list.get(i).x>jf.getWidth()+10) {
                    list.get(i).speed=-1*list.get(i).speed;
                }
                //先画上一个小球,再画当前的小球
                g.setColor(Color.WHITE);
                g.fillOval(list.get(i).x+list.get(i).speed, list.get(i).y+list.get(i).speed,list.get(i).size, list.get(i).size);
                //
                list.get(i).x+=list.get(i).speed;
                list.get(i).y+=list.get(i).speed;
                g.setColor(list.get(i).color);
                g.fillOval(list.get(i).x+list.get(i).speed, list.get(i).y+list.get(i).speed,list.get(i).size, list.get(i).size);

                    
            }
              try {
                  Thread.sleep (30);
                } catch (InterruptedException ie) {
                  throw new RuntimeException (ie);
                }
        }
        System.out.println("不要再点击了");
    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值