最终效果
落地
反弹
实现的功能:在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
这个功能还十分简陋,有待完善。