* 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....。