Java---实力弹弹球,弹弹弹

简介: 直接上代码了。 微调按钮加画布画几个圆,再实现监听。。。package cn.hncu.threadDemo.thread2;import java.awt.Canvas;import java.

直接上代码了。
微调按钮加画布画几个圆,再实现监听。。。

package cn.hncu.threadDemo.thread2;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.Timer;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class BallsJFrame extends JFrame implements ChangeListener{
    private BallsCanvas ball;
    private JSpinner spinner;

    public BallsJFrame(){
        super("弹弹球");
        this.setBounds(300, 200, 400, 300);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        Color colors[] = {Color.red,Color.green,Color.blue,Color.magenta,Color.cyan};

        ball = new BallsCanvas(colors,100);
        this.getContentPane().add(ball);//默认是CENTER位置

        JPanel panel = new JPanel();
        this.getContentPane().add(panel,"South");
        panel.add(new JLabel("Delay"));
        spinner = new JSpinner();
        spinner.setValue(100);

        panel.add(spinner);

        spinner.addChangeListener(this);

        this.setVisible(true);
    }
    @Override
    public void stateChanged(ChangeEvent e) {
        int value = Integer.parseInt(""+spinner.getValue());
        ball.setDelay(value);
    }


    public static void main(String[] args) {
        new BallsJFrame();
    }

}

class BallsCanvas extends Canvas implements ActionListener, FocusListener{
    private Ball balls[];//存放所有的球
    private Timer timer;//javax.swing.Timer

    public BallsCanvas(Color colors[] ,int delay){
        this.balls = new Ball[colors.length];
        for(int i=0,x=40;i<colors.length;i++,x+=20){
            this.balls[i] = new Ball(x,x,colors[i]);

        }

        //让当前画布监听 焦点事件
        this.addFocusListener(this);


        timer = new Timer(delay,this);
        timer.start();

    }

    public void setDelay(int delay){
        timer.setDelay(delay);
    }


    @Override
    public void paint(Graphics g) {
        for(int i=0;i<this.balls.length;i++){
            g.setColor(balls[i].color);


            //让每个球的坐标变化一下---(x坐标)
            balls[i].x = balls[i].left ? balls[i].x-10:balls[i].x+10;
            //当球碰壁时,更改球的方向
            if(balls[i].x<=0||balls[i].x>=this.getWidth()-24){
                balls[i].left = !balls[i].left;//切换方向
            }

            //让每个球的坐标变化一下---(y坐标)
            balls[i].y = balls[i].up ? balls[i].y-10:balls[i].y+10;
            //当球碰壁时,更改球的方向
            if(balls[i].y<=0||balls[i].y>=this.getHeight()-22){
                balls[i].up = !balls[i].up;//切换方向
            }



            g.fillOval(balls[i].x, balls[i].y, 20, 20);
        }
    }


    @Override
    public void actionPerformed(ActionEvent e) {
        //System.out.println("aaa");
        repaint();//刷新画布.调用paint(Graphics g)
    }



    @Override
    public void focusGained(FocusEvent e) {
        timer.stop();
    }

    @Override
    public void focusLost(FocusEvent e) {
        timer.restart();

    }




    private static class Ball{
        int x,y;
        boolean up,left;
        Color color;
        public Ball(int x, int y, Color color) {
            this.x = x;
            this.y = y;
            this.color = color;
            up = left = false;
        }

    }




}

目录
相关文章
|
5月前
|
编译器 Linux C语言
C++第二弹---C++入门(中)
C++第二弹---C++入门(中)
|
5月前
|
存储 安全 编译器
C++第三弹---C++入门(下)
C++第三弹---C++入门(下)
|
4月前
|
Java 开发者
揭秘!LinkedList是如何华丽变身成为Java队列之王的?
【6月更文挑战第18天】Java的`LinkedList`既是列表也是队列之星,实现`Queue`接口,支持FIFO操作。其内部的双向链表结构确保了添加/移除元素的高效性(O(1)),适合作为队列使用。它线程不安全,但可通过同步包装用于多线程环境。此外,`LinkedList`还能灵活变身栈或双端队列,提供多种数据结构功能。
48 11
|
4月前
|
XML Java 数据格式
走出Java资源加载的迷宫
走出Java资源加载的迷宫
22 0
|
5月前
|
存储 编译器 C++
C++第十一弹---类与对象(八)
C++第十一弹---类与对象(八)
|
5月前
|
编译器 C语言 C++
C++第一弹---C++入门(上)
C++第一弹---C++入门(上)
下一篇
无影云桌面