Java图形界面基础案例分析(满天星)

来源:互联网 发布:软件系统项目总结 编辑:程序博客网 时间:2024/04/20 05:31

对于前面的乌龟来说,我想各位已经经过进一步的练习,各位已经有了Java的初步编程能力,今天还是以案例入手,继续来讲述图形的界面的案例,今天带来的是怎么在框中画出星星。
## 满天星 ##
我按照自己学习Java的轨迹,开始了第二个小项目。现在我们来做满天星。在做之前大概可以想一想做好的结果是什么样子的。首先,还是先来捋一捋做项目的步骤。
我将这个项目分成三部:
1.先做一个黑天,也就是黑色的背景板
2.在黑色的背景上画上一颗星星
3.接着就是继续画上300颗星星。
各位在日后做项目时最好可以这样想想该怎么具体实现,把具体实现的步骤罗列下来,这对程序员来说非常的重要。以后在工作中你会遇到很复杂的任务,那么完成任务效率最高的办法就是将任务逐步分解细化,可以驾驭这一点说明你已经是一个很优秀的程序员了。
依照我的经验,我会先看看电脑的分辨率,最好就是背景可以把一整个屏幕铺满。我的PC的分辨率是2560 x 1600,那么久设计一个2560 x 1600的画板。具体实现第一步那么就开始写代码

import java.awt.Color;import java.awt.Frame;public class MyTest {    public static void main(String[]args){        Frame w = new Frame();        w.setSize(2560,1600); //根据自己电脑的实际分辨率进行设置画板的大小        w.setBackground(Color.BLACK);        w.show();    }}

上述的这段代码大家肯定以及是非常的熟练了,那么大家在运行的时候是不是像我这样黑的画板铺满全屏这样的结果呢
这里写图片描述

第一步已经完成,接下来来第二步怎么在漆黑的背景板上会上第一颗星星呢,是不是用前面我给大家介绍的绘图方法呢,是不是drawStar吗?很遗憾,Java中并没有提供直接画星星的办法,那怎么办?放心,肯定有解决的办法,我用drawString("*",30,30)这个方法来解决问题,画一个字符串,将键盘上上的"*"显示在屏幕上,后面的数字各位一猜就可以猜到,肯定就是坐标,下面我们来看看该怎么写,最好是先自己尝试再看我的代码
import java.awt.*;public class MyTest {    public static void main(String[]args){        Frame w = new Frame();        w.setSize(2560,1600); //根据自己电脑的实际分辨率进行设置画板的大小        w.setBackground(Color.BLACK);        MyPanel mp = new MyPanel();        w.add(mp);        w.show();    }}class MyPanel extends Panel{    public void paint(Graphics g){        g.drawString("*", 30, 30);    }}

在写这一段代码的时候我想强调一点就是关于顺序的问题,很多人写代码的习惯就是先把main里的代码先写完然后再去写下面的MyPanel.其实这并不是一个好习惯,编程讲究思维和逻辑,这个样子毫无逻辑可言,就是纯粹的在记代码,就像背单词一样,这样是毫无意义的。
试一下,在eclipse里运行一下,结果是什么
这里写图片描述
最后是不是发现还是黑乎乎的一片什么都没有,肯定有部分人觉得我在忽悠大家,我写的代码有问题,其实,这是错的,代码并没有问题,也确实在画板中出现的”*”,那么是什么原因导致我们看不见这一颗星星呢?有人可能已经想到了,可能问题就出在背景这一块,不知大家有没有想起我在在之前教大家画线的时候,由于没有设置颜色,默认是输出黑色线,这就说明在你不进行任何说明的情况下,Java就默认是黑色。现在我的窗体是黑的,星星也是黑的,这怎么找的到嘛,那么把现在就把颜色给条回来

import java.awt.*;public class MyTest {    public static void main(String[]args){        Frame w = new Frame();        w.setSize(2560,1600); //根据自己电脑的实际分辨率进行设置画板的大小        w.setBackground(Color.BLACK);        MyPanel mp = new MyPanel();        w.add(mp);        w.show();    }}class MyPanel extends Panel{    public void paint(Graphics g){        g.setColor(Color.WHITE);//将星星设置成白色        g.drawString("*", 30, 30);    }}

我们来看看运行结果
这里写图片描述
是不是真的在屏幕的左上方(30.30)的坐标出出现了一块白色的星星。
设置好了颜色,下面来完成第三步,怎么在屏幕上同时打印300颗星星,怎么办,同时用300次drawString()的方法吗?这个办法或许已经是最笨的办法了,但是可以很好的解决问题,但是在能够解决问题的基础上我们就要考虑怎么可以高效的解决问题,Ctrl+C,一次,然后按Ctrl+v300次?你输的过来吗?你确定一定粘贴的300句?这种计数的事情电脑最在行,完全可以交给电脑去处理。我们让电脑重复执行在画板上画星星这个操作,那么我们就要用到循环,用for循环语句

import java.awt.*;public class MyTest {    public static void main(String[]args){        Frame w = new Frame();        w.setSize(2560,1600); //根据自己电脑的实际分辨率进行设置画板的大小        w.setBackground(Color.BLACK);        MyPanel mp = new MyPanel();        w.add(mp);        w.show();    }}class MyPanel extends Panel{    public void paint(Graphics g){        g.setColor(Color.WHITE);        for(int i=0;i<300;i++){//用for循环重复执行drawString语句            g.drawString("*", 30, 30);        }    }}

好了,我们在eclipse中看看结果,结果发现什么[图片]
是不是只有一颗,有人又会说你又告诉我们错误的代码,怎么就只有一颗星星,各位仔细的想一想,(30,30)这个坐标,

g.drawString("*", 30, 30);

这句代码被重复执行了300遍,而且所画的300课星星全部重叠在一个点上,这也就是为什么最后的结果还是一颗星星了。
好了,问题又来了,这样是不是以为着我又要写上300个坐标了呢?我的天,这样想一想是不是觉得很烦,不过值得庆幸的是,Java并没有这么愚蠢,Java中提供了一种随机数的方法,叫做Math.random(),这个函数每次运行都会随机得到一个数,当然不止Java里有,其他的高级编程语言都会有类似的函数。而且我还可以告诉大家,这个Math.random()方法是静态方法,Math这个类里全是静态的,现在还有一个棘手的问题就是这个函数产生的数是0到1之间的数,都是零点儿几的数,这样的数放在坐标上怎么看,根本不满足我要的效果啊。星星都扎堆集中在左上角,有密集恐惧症的小伙伴不要尝试 。我们希望星星分布在全屏,分布在2560*1600的区域内,试想一下如何将0到1的数放大到0到2560之间的数呢?当然答案就是乘上2560,代码就变成了

Math.random()*2560

可是还是不行,计算机有一个麻烦的地方就是它非常关心数据类型,这是因为没有人那样的容错能力,即使是人,在不明确的数据类型面前也会糊涂,比如1+1等于几的问题,如果是两个数字那就是2,可是如果是两个字,那就是11了。所以计算机为了避免这样的问题,要去每个地方都明确数据类型,坐标需要整数,可是Math.random()*1024一定会产生小数,在Java中整形用int表示,所以我们用(int)随机数强行转换为整数,写法是

(int)(Math.random()*1024)

还有需要明确的一点是这个操作是舍尾操作,也就是说,1.1这样的数字转成整形就是1,1,9也是1,但是在我们这个项目中并没有影响。下面就剩下用(int)(Math.random()*1024)去替换坐标位置了

import java.awt.*;public class MyTest {    public static void main(String[]args){        Frame w = new Frame();        w.setSize(2560,1600); //根据自己电脑的实际分辨率进行设置画板的大小        w.setBackground(Color.BLACK);        MyPanel mp = new MyPanel();        w.add(mp);        w.show();    }}class MyPanel extends Panel{    public void paint(Graphics g){        g.setColor(Color.WHITE);        for(int i=0;i<300;i++){            g.drawString("*", (int)(Math.random()*2560), (int)(Math.random()*1600));        }    }}

看看结果
这里写图片描述
今天的小项目也就到此结束,还是那句话,多多练习,代码不是靠学的,是靠写出来的

关于数据类型的拓展

Java是一种强类型语言,意思是Java中所有变量必须显示地声明数据类型,这就意味着Java中的变量必须先声明再使用。虽然Java是一种春面向对象语言,但是基于效率的考虑,在Java中有8中基本数据类型不是对象,除了基本数据类型还有引用数据类型,当然目前我当然不会介绍这8中基本数据类型是什么,以及他们的定义和范围,这个会在日后的编程学习中和大家介绍,要是大家想要提前知道这8种是什么可以自己去查阅相关的资料。
不同的数据类型的值经常要进行转换,有两种类型转换方式,自动转换类型和强制转换类型,当把一个范围小的数赋值给一个范围大的数时,系统可以进行自动类型转换,虽然String不是基本数据类型,但是我还是要在这里提一下,将任何数据类型和字符串值进行连接运算时,基本数据类型的值都尅自动转换成String。
将范围大的数据类型值换成范围小的数据类型时,因为会丢失精度,所以不能自动转换,编译的时候,编译器会报告错误,这时通常要进行强制类型转换,相当于告诉编译器,你允许这样的精度丢失,比如,在我们这个例子中,将小数转换成整数,小数的范围很大,因为小数比整数多出存放小数位的空间,所以无法进行自动类型转换,只能进行强制类型转换,问题是这样会丢失小数位,但是这个例子我们允许丢失。
今天的博客就更到这里,下期再见

                                                                3月30日                                                                1:54am                                                                 by WhiteJavaCoder
0 0