- 刚学了Java的GUI,实现了一下老师上课讲的一个程序.
//package wordClear;
import java.util.*;
import javax.swing.*;//用到了这个包里的JFrame和JPanel,这俩是分别继承Frame和Panel的
import java.awt.*;//这个包是拿来实现Frame和Panel的,当然这个程序我用不到这个包
public class MySnow
{
static Scanner sc=new Scanner(System.in);
public static void main(String[]args)
{
JFrame F=new JFrame("MySnow");//显示窗口
F.setVisible(true);//让窗口可关闭,Frame的关闭很难写,所以用了JFrame
F.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体位置,大小
F.setBounds(50,50,600,400);//设置窗口大小不可改变
F.setResizable(false);//设置窗口背景颜色为黑色
F.setBackground(Color.BLACK);
MyPanel M=new MyPanel();
F.add(M);
Thread T=new Thread(M);
T.start();
}
}
/**
**下面这段代码就是实现了画布MyPanel,
**该'画布'继承了JPanel并且实现了多线程Runnable接口中的run()方法
*/
class MyPanel extends JPanel implements Runnable
{
int[] x=new int[200];
int[] y=new int[200];
MyPanel()//用构造函数来随机生成200个雪花的坐标
{
for(int i=0;i<200;i++)
{
x[i]=new Random().nextInt(600);
y[i]=new Random().nextInt(1200);//这个纵坐标是整个界面的三倍,原因是不想一轮循环后雪花重复
}
}
public void paint(Graphics G)//paint方法,用来生成雪花形状
{
/**
**JPanel相对Panel来说有一个不好的地方,不能自行覆盖
**为什么不好,注释掉下面两行自行体会,下面这个东西是弥补缺陷的
*/
G.setColor(Color.BLACK);
G.fillRect(0, 0, 600, 400);
G.setColor(Color.WHITE);
for(int i=0;i<200;i++)
G.fillOval(x[i], y[i], 5, 5);
}
public void run()//实现多线程,不用到多线程的话,我现在还不知道要怎么实现让雪花动起来这个操作
{
while(true)
{
for(int i=0;i<200;i++)//更新雪花坐标,每次线程运行就更新一次,实现让雪花看着像动起来
{
if(y[i]==1200)//雪花触碰到三倍高度的底把该雪花y坐标移回顶部
y[i]=5;
y[i]+=1;
}
try//try和catch是处理异常
{
Thread.sleep(10);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
repaint();//重画雪花
}
}
}