Java程序设计(十三)----模拟一个信号灯
2012-11-09 16:52
295 查看
* 程序的版权和版本声明部分
* Copyright (c) 2012, 烟台大学计算机学院学生
* All rights reserved.
* 作 者: 刘镇
* 完成日期: 2012 年 11 月 09日
* 版 本 号: 2.013
* 对任务及求解方法的描述部分
* 问题描述:模拟一个信号灯的软件。在JFrame的北面添加一个下拉列表,该下拉列表有“默认无信号”、“红灯”、“绿灯”和“黄灯”选项。当用户在下拉列表选择某项后,产生相应的信号灯。
*代码部分:
MySignal.java:
TestSignel.java:
测试结果:
心得经验:
一、对于布局的处理:我尝试过开始用一段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....。
* 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....。
相关文章推荐
- JAVA--第十一周实验--模拟一个信号灯的软件
- java上机 第十一周 任务2 模拟一个信号灯
- Java实训——编写一个窗体应用程序模拟交通信号灯。
- JAVA--第十一周实验--模拟一个信号灯的软件--代码重构--升级版
- Java 实训5 编写一个窗体应用程序模拟交通信号灯
- 计算机网络实验,JAVA实现一个简单GBN协议,模拟引入数据包的丢失,验证协议的有效性
- 分享java程序设计中一个小程序:获取当前系统日期和时间在小程序中显示出来
- Java使用LinkedList模拟一个堆栈或者队列数据结构
- java写得一个模拟浏览器源码
- java模拟而一个电话本操作
- Mockito:一个强大的用于Java开发的模拟测试框架
- JAVA--第九周实验--编写一个模拟用户帐户的程序(内测版)
- 如何实现用Java编写程序,设计一个模拟电梯运行的类
- Mockito:一个强大的用于Java开发的模拟测试框架
- 模拟Ping操作的一个Java类
- 一个效果不错的Java Swing模拟屏幕截图工具类
- 使用javascript模拟了一个类似Java的HashMap类
- Mockito:一个强大的用于Java开发的模拟测试框架
- Java并发库(十三):Condition、几个线程有顺序地一个搞一会儿
- 用Java模拟一个Post表单提交(302和301)