码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA程序设计(12.2)---- 多态、监听器初级应用:在窗口中绘制图形,可以选择圆形 正方形 线条

时间:2014-11-02 09:31:28      阅读:342      评论:0      收藏:0      [点我收藏+]

标签:blog   http   io   color   os   ar   使用   java   for   

1.在800 *800 的窗口中加入3个按钮 可以选择当前的画笔画出什么样的图形 有圆 正方形 直线 三种

JFrame 监听器使用 内部类 匿名内部类 接口 多态

1.先做所有图形的抽象类

package com.lovo.homework;

import java.awt.Color;
import java.awt.Graphics;

/**
 * 抽象类:图形
 * @author Abe
 * 属性:起点坐标 终点坐标 颜色
 */
public abstract class Figure {
	protected int startX, startY;
	protected int endX, endY;
	protected Color color;

	/**
	 * 构造器
	 */
	public Figure() {

		this.color = this.radomColor();
	}
	/**
	 * 方法:随机颜色
	 */
	public Color radomColor(){
		int r = (int) (Math.random() * 256);
		int g = (int) (Math.random() * 256);
		int b = (int) (Math.random() * 256);
		Color color = new Color(r, g, b);
		return color;
	}
	
	/**
	 * 方法 :get and set        //不知道用不用得上先加上再说
	 * @return
	 */
	public int getStartX() {
		return startX;
	}
	public void setStartX(int startX) {
		this.startX = startX;
	}
	public int getStartY() {
		return startY;
	}
	public void setStartY(int startY) {
		this.startY = startY;
	}
	public int getEndX() {
		return endX;
	}
	public void setEndX(int endX) {
		this.endX = endX;
	}
	public int getEndY() {
		return endY;
	}
	public void setEndY(int endY) {
		this.endY = endY;
	}
	public Color getColor() {
		return color;
	}
	
	/**
	 * 抽象方法 画图
	 * @param g
	 */
	public abstract void draw(Graphics g) ;
}

2.类 :圆形

package com.lovo.homework;

import java.awt.Graphics;

/**
 * 类: 圆
 * 父类:图形
 * @author Abe 
 */
public class Circle extends Figure{

	@Override
	public void draw(Graphics g) {
		g.setColor(this.radomColor());	//重写绘制方法  沿用了老师的XY判断
		int x = startX < endX? startX : endX;
		int y = startY < endY? startY : endY;
		g.drawOval(x, y, Math.abs(endX - startX),Math.abs( endY - startY));
	}
}

3.类 :正方形

package com.lovo.homework;
/**
 * 类:正方形
 * @author Abe
 * 父类 :Figrue 图形 
 */
import java.awt.Graphics;

public class Ractangle extends Figure {

	@Override
	public void draw(Graphics g) {	//重写绘制方法,本来想用交换大小的方法绘图的 结果感觉麻烦多了
		g.setColor(this.radomColor());		//优化了下老师的坐标确定方法
		int x = Math.min(startX, endX);
		int y = Math.min(startY, endY);
		g.drawRect(x, y, Math.abs(endX - startX), Math.abs(endY - startY));
	}
}

4.类 :直线

package com.lovo.homework;

import java.awt.Graphics;
/**
 * 类:直线
 * 父类:Figure
 * @author Abe
 */
public class Line extends Figure {
	@Override
	public void draw(Graphics g) {
		g.setColor(this.radomColor());
		g.drawLine(startX, startY,endX,endY);
	}
}

5.绘制窗口,加事件监听器,加鼠标监听器(适配器)

适配器,用于继承,只用重写需要的功能,其他的自动打酱油

package com.lovo.homework;

import java.awt.Button;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

/**
 * 类 :作图窗口
 * 父类: JFrame
 * @author Abe
 */
import javax.swing.JFrame;

@SuppressWarnings("serial")			//不知道这货是啥意思  MyFrame自动修复出来的
public class MyFrame extends JFrame {
	private Button b1 = new Button("圆形");
	private Button b2 = new Button("矩形");
	private Button b3 = new Button("线段");

	private Figure fig = null;
	private Boolean boo = true;

	/**
	 * 内部类:事件监听器
	 * @author Abe
	 */
	public class MyListenner implements ActionListener {//接口事件监听器
		@Override
		public void actionPerformed(ActionEvent e) {
			Object obj = e.getSource();
			if (obj == b1) {
				fig = new Circle();
			} else if (obj == b2) {
				fig = new Ractangle();
			} else if (obj == b3) {
				fig = new Line();
			}
		}
	}

	/**
	 * 内部类 :鼠标适配器
	 * @param e
	 */
	public class MyMouseAdapter extends MouseAdapter {	//继承鼠标适配器
		@Override
		public void mousePressed(MouseEvent e) {	//重写点击事件
			if (fig != null) {
				fig.setStartX(e.getX());
				fig.setStartY(e.getY());
				fig.setEndX(e.getX());
				fig.setEndY(e.getY());
			}
		}
		@Override
		public void mouseDragged(MouseEvent e) {	//重写拖拽事件
			if (fig != null) {
				fig.setEndX(e.getX());
				fig.setEndY(e.getY());
				repaint();
			}
		}
	}

	/**
	 * 构造器
	 */
	public MyFrame() {
		this.setTitle("选择工具作画");
		this.setSize(800, 800);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setResizable(false);
		this.setLocationRelativeTo(null);
		this.setLayout(null);

		b1.setBounds(220, 10, 75, 35);
		b2.setBounds(350, 10, 75, 35);
		b3.setBounds(480, 10, 75, 35);
		this.add(b1);
		this.add(b2);
		this.add(b3);

		MyMouseAdapter adapter = new MyMouseAdapter();
		this.addMouseListener(adapter);
		this.addMouseMotionListener(adapter);
		MyListenner l = new MyListenner();
		b1.addActionListener(l);
		b2.addActionListener(l);
		b3.addActionListener(l);

	}
	/**
	 * 重写绘图方法
	 */
	@Override
	public void paint(Graphics g) {
		if (boo != true) {
			g.clearRect(0, 0, 800, 800);
			boo = true;
		}
		// super.paint(g);		//启用则 窗口无残影 只能看到最后的绘制的图形
		if (fig != null) {
			fig.draw(g);
		}
	}

	public static void main(String[] args) {
		new MyFrame().setVisible(true);
	}
}

绘图效果看起来很虚幻 ,可惜刷新窗口后 就只会显示最后的图形

本来想用个数组存起来的,但是这数组一旦实例化之后 多态又加不进去 ……  要不就是用3个数组分别存3个图形?感觉好麻烦……  应该有更好的办法吧……


bubuko.com,布布扣


JAVA程序设计(12.2)---- 多态、监听器初级应用:在窗口中绘制图形,可以选择圆形 正方形 线条

标签:blog   http   io   color   os   ar   使用   java   for   

原文地址:http://blog.csdn.net/anubies/article/details/40682891

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!