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

* 程序的版权和版本声明部分
* 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....。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章