发表于: 2017-08-15 05:01:17
1 916
1.3 满天星
代码如下:
import java.awt.*;
import java.awt.event.*;
public class Stat {
public static void main(String[] args) {
Frame w = new Frame() ;//在主函数里定义一个框架对象
w.setSize(1024 , 768) ;//调用对象的setSize方法,调整框架的大小
w.setBackground(new Color(90 , 70 , 149)) ;//调用setBackground方法来设置框架的颜色,参数列表中新定义了一个Color对象,这里不使用Color中封装好的颜色(Color.Red等等),使用RGB法来自定义一个颜色
MyPanel mp = new MyPanel() ;//定义一个MyPanel对象
w.add(mp) ;调用框架对象继承的add方法,使得“画板增加到框架上”
w.show() ;//显示出框架
w.addWindowListener(new WindowAdapter() { //关闭窗口
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}) ;
}
}
class MyPanel extends Panel {
public void paint(Graphics g) {
g.setColor(new Color(192 , 192 , 192)) ;
for(int i = 0 ; i < 300 ; i ++) {
g.drawString("*" , (int)(Math.random()*1024) , (int)(Math.random()*768)) ;
}
g.drawString("*" , 50 , 60 ) ;
}
}
结果如下:
在复制粘贴关闭窗口代码的时候,复制完,代码的最上头自动帮我加上了如下的代码:
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
eclipse好智能啊,怪不得老师不建议用它。用EditPlus编程的时候绝对不会出现这种事情,要出现也会出现下面的事情:
什么?你没有导入这个java.awt.event.*这个类?别指望我给你导入,我只管编译运行,其他的你错了我会报错,错的地方自己修改,就酱。
eclipse对新手特别友好,友好到帮我们做了本来我们该做的事情,这样看似友好,其实是鱼塘里养鱼。在看下一小节之前我又阅读了一下程序,发现有一个问题我没有理解:在MyPanel类中定义的唯一的一个方法不是构造方法,那么它是怎么被执行的呢?肯定不是语句MyPanel mp = new MyPanel() ;那么是w.add(mp) ;么?找来找去只找到add是继承的方法。
问题:在上述代码中,MyPanel类中的对象mp是在哪个语句中调用类中的paint方法,从而执行方法中的内容,打印出满天星的呢?
1.4 飞行的小球
由于书是面向所有人的,包括真正零基础的人。所以书上写的很详细但是不是教条式的讲解。用到了变量,老师就用自己的话来解释什么事变量;在《疯狂》一书中,介绍到变量是解释变量在计算机中的存储等等一段话。挺深入的。但是没能做到浅出。
在本小节书上介绍到了线程。看完没砸吧出滋味,又看了疯狂书上的介绍。大致了解了线程的创建和启动:线程的创建者是java中代表线程的Thread类的对象实例或者是子类的对象实例。线程需要做的事情放在要重写的run()方法里。启动的话用start()方法。
用书上的代码就是实现不出来,甚至只有窗体,其他毛都没有。然后查找了很长时间,发现了这个:
一个错误:MyPanel类已经定义过。怎么会出现这种情况?查看了我左边的Package Explorer,意识到我上次的java源文件和这次的源文件在同一个工程里。一定是同一个工程里不能重复定义类,即使是在不同的源文件里。修改类名,问题解决,运行:
import java.awt.* ;
import java.awt.event.*;
public class Fly {
public static void main(String[] args) {
Frame f = new Frame() ;
f.setSize(300 , 400) ;
MyPanel2 mp = new MyPanel2() ;
f.add(mp) ;
Thread t = new Thread(mp) ;
t.start() ;
f.show() ;
f.addWindowListener(new WindowAdapter() { //关闭窗口
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}) ;
}
}
class MyPanel2 extends Panel implements Runnable {
int x = 30 ;
int y = 50 ;
public void paint(Graphics g) {
g.fillOval(x , y , 20 , 20) ;
}
public void run() {
while(true) {
y ++ ;
if(y > 400) {
y = 0 ;
}
repaint() ;
}
}
}
不知道是我电脑的问题还是什么,第一次运行的时候什么都没有,第二次运行的时候结果才正常,球动得飞快。
下一小节就针对这个问题继续讨论。球动得这么快,有什么方法在每次执行完循环后停下来一会然后再执行么?有,用类方法Thread.sleep()。书上说这是能够让线程休眠的方法。接下来书上就根据这个方法来介绍了异常。异常是可能存在的错误。举我的例子,我电脑换了个SSD,原来的硬盘拿出来做成了移动硬盘,这样我的电脑一点都不卡了。但是我的SSD只有120G,装LOL会卡。怎么办?装在移动硬盘上。想玩的时候插上硬盘,不想玩的时候拔掉。这样既节省了空间,又能有效地放置电脑变卡。但是,如果我在打LOL的时候不小心拔掉了移动硬盘的USB接口,电脑就会提示读取错误。异常在上述的例子怎么体现的呢?在我插入移动硬盘并启动LOL的时候,就有可能造成异常(随时都有人会拔掉USB接口),只是Windows系统不像Java语言那么严谨,可能异常的情况不提示你。在java中强制规定在可能出现异常的代码后必须写异常处理的程序。
try{
Thread.sleep(x ms) ;
}catch(Exception e){}
上面三行代码就是上面程序的异常处理程序。加上这句话,运行窗口就非常像之前VB考试的一些使用了定时器的题目了。
下午继续。
评论