讨论区不能帮忙做功课呀!? 这我不清楚...
不过, 你的功课是说明程式, 因为看不懂才拿来这儿问的, 我想这也算是一种"问题讨论"才是。
相信讨论区中有人是专攻 Java 的, 期待他的出现与补充吧。
我很久没接触 Java 了, 大致地看了一下, 或许无法说明得太详尽, 请多多包涵!
首先, 让我们来看看宣告。
public class LogoAnimator extends JPanel implements ActionListener,
这一行可以看出, 他是一种有 GUI 介面的程式, 因为有继承 "JPanel"。至于 ActionListener, 表示这程示会监听使用者的回应, 类是滑鼠啦, 或是键盘之类的动作。
接下来要真正进入程式了, 先找到 main() 这个方法, 因为这是程式的进入点。每个程式皆是如此的。
复制程式
public static void main( String args[] )
{
LogoAnimator animation = new LogoAnimator();
JFrame window = new JFrame( "Animator test" );
window.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
Container container = window.getContentPane();
container.add( animation );
window.addKeyListener( animation.keyHdlr );
window.pack();
window.setVisible( true );
animation.startAnimation();
}
LogoAnimator animation = new LogoAnimator(); <- 这里是去呼叫一个程式, 呼叫的方法就是先宣告一个物件, 这个物件会拷贝那个要呼叫的程式码, 而 new 则是真正的执行, 这时, 那程式里的建构子会先执行。 这个程式应该算是 "Recursive" 结构, 也就是自己呼叫自己的这种结构。
再来看看建构子。建构子是拿来初始化的, 所以不应该有任何的程式动作。大部份是拿来设定一些数值用的。
复制程式
public LogoAnimator()
{
img[0] = new ImageIcon("01.gif");
img[1] = new ImageIcon("05-1.gif");
keyHdlr = new KeyHandler();
}
看完了建构子, 可以发现, 它是在设定img[0], img[1], 还有 keyHdlr 这三个变数的值。其中 KeyHdlr 是去 new 一个 KeyHandler 程式。内容是键盘侦测的命令, 和 new LogoAnimator() 的手法相似。 所以, 往后只要呼叫到 keyHdlr, 它都会去执行下面这些程式码。
复制程式
private class KeyHandler extends KeyAdapter {
public void keyPressed( KeyEvent e )
{
key = e.getKeyCode();
System.out.println("Get key " + key );
}
}
这些程式码, 看起来很简单。 就是读取键盘的输入, 再输出 "Get key " 加上键盘的输入, 就这样简单。
接下来, 回到 main(), 看看后续的命令。
JFrame window = new JFrame( "Animator test" );
这是去创造一个 Frame GUI 的命令, 而标题是 "Animator test"。 以前都是用 awt 去实作的, 现在流行 Swing。 如何分辨呢? 通常有个大写J字开头的算 Swing。 印象中, awt 比较需要作业系统的支援, 所以相同的 awt 程式在不同的作业系统上, 看到的可能不太相同。 至于 Swing 的则是比较不会有这种情况, 所以建议大家多多用 Swing 来写 GUI 介面。
离题了... 来看下面的命令吧!
window.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 这是宣告这 GUI 的关闭方式, 按下视窗右上角的X钮即可关闭。
Container container = window.getContentPane(); 在我的印象中, container 是一种视窗元件的抽象类别, 所以一般来说不能直接用它, 但可以去用它的一些子类别。 我也不知道该怎么去形容它, 你可以把它想成是一种容器, 等等程式应该会把某些视窗元件往这里丢才是, 我们往下看看吧。
container.add( animation ); 果然没错, 写这程式的人把 animation 这玩意儿丢了进去。 还记得吗? 程式一开始就 new 了个 LogoAnimator 物件, 那物件的名称就叫 animation。 所以, 这行命令的意思就是将那物件的回传值交给 Container 来处理。
window.addKeyListener( animation.keyHdlr ); 这一行则是呼叫所谓的 System call ... 我也不确定, 请你自己问同学查证吧, 我猜这应该算是 System call。 不管是不是, 可以确定的是, 这命令的目的是要作业系统去监听使用者的键盘动作。
window.pack(); 应该是让程式自己去设定介面大小吧 ... 这我也不确定, 也请你自己问一下同学啰!
window.setVisible( true ); 这命令是设定这元件为可视的, 可以看见的。
animation.startAnimation(); 重点来了, 之前都算是设定, 这里才真正开始执行你设计的 Game 了。
我们来看看 startAnimation():
复制程式
public void startAnimation()
{
if ( animationTimer == null ) {
animationTimer = new Timer( 100, this );
animationTimer.start();
}
else
if ( ! animationTimer.isRunning() )
animationTimer.restart();
}
大概的意思是, 如果还没开始就设定开始, 若开始了则去辨识是否在正执行了? 若没有就再执行一次。
其它的程式码都算是 GUI 的设定, 我很多都看不懂, 因为我很少写 GUI 的程式, 希望您见谅, 不过, 那些设定的程式, 我想你应该问得到人才对, 同学应该会。 至于程式走向, 流程, 就如我刚的说法, 你解释给老师看看, 说不定老师会睁一只眼闭一只眼让你过了呢!
我想我应该已经帮你把不懂的范围缩小了才是 ... 总之, 加油 ~ 有不懂的再来发问看看!
^_^