【Java 初学GUI】画个小球自由落体(Part1)

画个小球自由落体

最终效果

在这里插入图片描述
落地
在这里插入图片描述
反弹
在这里插入图片描述

实现的功能:在Java画板上加载按钮、文字和小球,涂色

按钮“开始 / 中止 / 继续”的功能:第一次点击后,小球开始做自由落体运动,小球落地能量无损耗地反弹,如此往复。期间再次点击,运动中的小球会"时间暂停“,冻结”在相应位置,只有通过再次点击该按钮实现恢复运动状态,时间继续流动。可以多次点击使小球在“Move”和“Freeze”之间切换。

按钮“关闭”的功能:退出画板、结束进程

涉及知识点:多线程、GUI

代码实现

package freefall;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class FreeFall extends JPanel{
    Toolkit kit = Toolkit.getDefaultToolkit();
    Dimension screenSize = kit.getScreenSize();
    int screenHeight = screenSize.height;
    int screenWidth = screenSize.width;
    boolean moveOrFreeze=false,reverse=true;
    int dHeight=0;
    int times=0;
    public void init(){
        this.setLayout(null);
        
        JFrame jf=new JFrame("aBallFreeFall");
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setSize(screenWidth, screenHeight-50);
        jf.setLocation((screenWidth - jf.getWidth()) / 2, (screenHeight - jf.getHeight()) / 2 - 25);
        jf.add(this);
        jf.setUndecorated(true);
        jf.setVisible(true);
        
        JButton jb1=new JButton("关闭");
        JButton jb2=new JButton("开始   /   中止   /   继续");
        jb1.setBounds(screenWidth-105, 5, 100, 30);
        jb2.setBounds((screenWidth-300)/2, 5, 300, 30);
        jb1.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent e) {
                System.exit(0);
                }
            }
        );
        jb2.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent e) {
                moveOrFreeze=!moveOrFreeze;//控制小球时间静止或流动
                }
            }
        );
        this.add(jb1);
        this.add(jb2);
    }
    
    public void paint(Graphics g){
        dHeight=times*times/80;
        super.paint(g);
        g.setFont(new Font("楷体", Font.HANGING_BASELINE, 20));
        g.drawString("随便画画", 10, 30);
        g.drawLine(0,40,screenWidth, 40);
        g.drawLine(0,screenHeight-70,screenWidth,screenHeight-70);//画出上下两条界线
        g.setColor(Color.white);
        g.fillRect(5, 40, screenWidth-10, screenHeight-110);//两条界线之间涂成白色
        g.setColor(Color.blue);
        g.fillArc(screenWidth/2, 150+dHeight, 50, 50, 0, 360);//涂一个蓝色小球
        g.setColor(Color.black);
        g.drawArc(screenWidth/2, 150+dHeight, 50, 50, 0, 360);//给小球画黑边圆弧线
    }
    Runnable r=()->{
        while(true){
            while(reverse&&moveOrFreeze){
                if(dHeight+150+50>screenHeight-70){
                    reverse=!reverse;
                    break;
                }
               try{
                    Thread.sleep(5);
                }catch(InterruptedException ee){}
                repaint();  
                times++;
            }//实现落地过程的不断刷新屏幕,5ms刷新一次
            while(!reverse&&moveOrFreeze){
                if(times==0){
                    reverse=!reverse;
                    break;
                }
                try{
                    Thread.sleep(5);
                }catch(InterruptedException ee){}
                repaint();  
                times--;
            }   //实现反弹过程中的不断刷新屏幕,5ms刷新一次
            
        }
    };
    public static void main(String[] args) {
        FreeFall ff=new FreeFall();
        ff.init();//画板各组件准备就绪
        Thread move=new Thread(ff.r);
        move.start();//小球刷新准备就绪
    } 
}

emmmm

这个功能还十分简陋,有待完善。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值