Java程序设计(十三)----模拟一个信号灯

来源:互联网 发布:easyui js隐藏a标签 编辑:程序博客网 时间:2024/06/06 02:52
* 程序的版权和版本声明部分
* Copyright (c) 2012, 烟台大学计算机学院学生
* All rights reserved.

* 作 者: 刘镇
* 完成日期: 2012 年 11 月 09日
* 版 本 号: 2.013

* 对任务及求解方法的描述部分

* 问题描述:模拟一个信号灯的软件。在JFrame的北面添加一个下拉列表,该下拉列表有默认无信号红灯绿灯黄灯选项。当用户在下拉列表选择某项后,产生相应的信号灯。

*代码部分:

 

 

 

MySignal.java:

 

 

 

 

package lz_11w;import java.awt.*;import java.awt.event.ItemEvent;import java.awt.event.ItemListener;import java.awt.image.ImageObserver;import javax.swing.JFrame;class MyCanvas extends Canvas{private int x, y, r;private Color color;public Color getColor() {return color;}public void setColor(Color color) {this.color = color;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public int getR() {return r;}public void setR(int r) {this.r = r;}MyCanvas(){setBackground(Color.white);x = 300;y = 50;r = 0;color = Color.white;}public void paint(Graphics g){g.setColor(Color.black);g.fillRect(290, 90, 120, 320);g.setColor(color);g.fillOval(x, y, r, r);}}public class MySignal extends JFrame implements ItemListener{Choice choice;MyCanvas oval;Panel panel;MySignal(){this.setTitle("我的信号灯");choice = new Choice();choice.add("无信号");choice.add("红");choice.add("黄");choice.add("绿");choice.addItemListener(this);oval = new MyCanvas();panel = new Panel();panel.add(choice);this.add(panel, BorderLayout.NORTH);this.add(oval, BorderLayout.CENTER);setBounds(300, 80, 750, 550);setExtendedState(Frame.MAXIMIZED_VERT);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setVisible(true);validate();}public void itemStateChanged(ItemEvent e) {if(choice.getSelectedItem().equals("无信号")){oval.setR(0);oval.repaint();}else if(choice.getSelectedItem().equals("红")){oval.setY(100);oval.setR(100);oval.setColor(Color.red);oval.repaint();}else if(choice.getSelectedItem().equals("黄")){oval.setY(200);oval.setR(100);oval.setColor(Color.yellow);oval.repaint();}else if(choice.getSelectedItem().equals("绿")){oval.setY(300);oval.setR(100);oval.setColor(Color.green);oval.repaint();}}}


 

TestSignel.java:

 

 

package lz_11w;public class TestSignal {public static void main(String[] args) {MySignal s = new MySignal();}}


 

测试结果:

 

 

 

 

 

 

 

 

 

心得经验:

 

 

一、对于布局的处理:我尝试过开始用一段setLayout(new FlowLayout());设置布局;结果只是显示了choice控件的内容,后来发现是在add(,)中有设置了BorderLayout,因此一直产生了不能生成Canvas内容问题。

二、对于Panel:我尝试过将Canvas放入一个画布Panel中,将Choice放入另一个Panel中,并分别将两个Panel添加到JFrame中;结果也是不能产生画布内容;但如果将Canvas直接添加到JFrame,将一个包含Choice的画布panel再加到JFrame中,问题就解决了。

三、涉及到处理时间问题:当选中某一个单选选项;就执行什么算法,纠结于怎样才能让产生的圆动起来,后来发现不就可以通过修改位置,(Canvas中的paint()中的位置)来实现指示灯的变换;剩下的问题就是怎样处理位置的坐标:也产生了一点小小问题,我打算在外部加一个类似外壳的矩形,可调整fillRect(x, y, width, height)x和y,其实应该讲其变小一些,但总觉得应该把显示的整体矩形变大;结果就出现圆指示灯漏出,后来体会出x,y是类似初始坐标点,而后两个参数才是实际的大小控制;

四、如何将圆“喷”颜色:灯在变,可就是一个白框框,啥也不代表。本来觉得应该有处理所花图像颜色的方法,残酷的现实就是没有填充的方法,在网上搜也没结果,后来发现除了课本中提到的drawOval可以画圆(我觉得根本不能出称得上是圆而是一个圆框而已),而fillOval却也能实现画圆的目的,并且圆都是有颜色的,根据API所说:“使用当前颜色填充外接指定矩形框的椭圆。”不就是我要找的,所以可以在之前将默认颜色改为自己想的,用到setColor(),然后再fillOval()就完成了。

五、在无意中发现自己所处理的JVM都在资源管理器中有运行,而且数量庞大,但确实关闭了,但只说明只是表面现象;突然想到课本有一段关于“setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);”就尝试了一下,发现再也没有发生关闭后在后台运行。

 

其中我认为自己还应多了解的内容有:Graphics这个图像类(repaint()方法就应该了解怎样实现重画);JFrame及Frame的设置方法Set....。