实验三 类的继承与多态的应用

注意

完成实验报告及源码链接:https://download.csdn.net/download/qq_29711355/85640553

一、实验目的:

1、练习类的继承与多态设计过程;
2、练习面向对象的图形用户界面设计、事件设计方法。

二、实验内容:

1、利用多态性编程,创建一个 square 类实现,求三角形、正方形和圆等形状面
积。方法抽象出一个共享父类,定义一个函数为求 square 面积,根据形状共有
特征构建父类及子类继承关系,再重新定义各形状的求面积函数。要求在主类当
中创建不同类的对象,并求不同形状的面积。
2、在第 1 题的基础上,在抽象类中增加一个 drawSquare()方法,具体类中实现
这个方法。

三、实验要求:

1、将第 1 题抽象类名改为 Figure,三角形改为“等腰直角三角形”,各具体类名称
分别为 RightTriangle、Square 和 Cycle;
2、编写测试类 TestSquare,检验第 1 题的结果;
3、在第 1 题的基础上,在抽象类中增加一个 drawSquare()方法,具体类中实现
这个方法;
4、设计一个类似 Windows 的 Application 应用程序,在窗体上调用第 2 题的
drawSquare()方法显示不同类型 Square。

四、实验报告内容要求:

1、说明抽象 Square 类、具体图形类的设计过程;
2、说明测试类 TestSquare 的设计过程及测试结果;
3、说明 drawSquare()方法的设计与验证过程;
4、简要说明你在该实验中的收获与体会。

五、参考代码:

‘Cycle’ 类


import java.awt.Graphics;
import java.awt.Point;

public class Cycle extends Figure{
	private int diameter;
	@Override
	public void drawFigure(Graphics g, int select) {
		g.setColor(getColor());
		int x = getStart().x;
		int y = getStart().y;
		if (select == 0) {
			g.drawArc(x, y, diameter, diameter, 0, 360);
		}else {
			g.fillArc(x, y, diameter, diameter, 0, 360);
		}
	}

	@Override
	public double getArea() {
		return Math.PI*diameter*diameter/4;
	}

	@Override
	public double getPerimeter() {
		return Math.PI*diameter*2;
	}

	@Override
	public void setEnd(Point end) {
		super.setEnd(end);
		diameter = (int) Math.sqrt(Math.pow(Math.abs(getEnd().x - getStart().x), 2) + Math.pow(Math.abs(getEnd().y - getStart().y), 2));
	}

}

‘DrawFram’ 类

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class DrawFram extends JFrame{

	
	public DrawFram(){
		this.init();
		this.loadNorth();
		this.loadCenter();
	}

	private void init() {
		setTitle("画板");
		setLayout(new BorderLayout());
		setLocationRelativeTo(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(new Dimension(1000,600));
		setVisible(true);
	}
	
	//北部控件
	JPanel jPanel = new JPanel();
	JButton jb_cycle = new JButton("圆形");
	JButton jb_square = new JButton("正方形");
	JButton jb_righttriangle = new JButton("直角三角形");
	JButton jb_color = new JButton("颜色");
	
	private void loadNorth() {
		jPanel.add(jb_cycle);
		jPanel.add(jb_square);
		jPanel.add(jb_righttriangle);
		jb_color.setBackground(Color.BLACK);
		jPanel.add(jb_color);
		add(jPanel,BorderLayout.NORTH);
	}
	
	private void loadCenter() {
		MyCanvas myCanvas = new MyCanvas();
		myCanvas.setBackground(Color.WHITE);
		add(myCanvas,BorderLayout.CENTER);
	}
	
	//画布
	private Figure figure = null;
	private MyActionListener myActionListener = new MyActionListener();//添加按键点击事件
	private ArrayList<Figure> figs= new ArrayList<Figure>(); //用于存放已经话好的图形
	private ArrayList<Integer> figTypes = new ArrayList<Integer>(); //用于存放已经话好的图形的种类
	private Color color = Color.BLACK;
	public class MyCanvas extends Canvas{
		public MyCanvas() {
			MouseAdapter mouseAdapter = new MouseAdapter() {

				@Override
				public void mousePressed(MouseEvent e) {
					super.mousePressed(e);
					figure.setStart(e.getPoint());
					figure.setColor(DrawFram.this.color);
				}

				@Override
				public void mouseReleased(MouseEvent e) {
					// TODO Auto-generated method stub
					super.mouseReleased(e);
				}

				@Override
				public void mouseDragged(MouseEvent e) {
					super.mouseDragged(e);
					
					figure.setEnd(e.getPoint());
					System.out.println(figure.getEnd().x);
					System.out.println("" + figure.getEnd().x +"   "+ figure.getEnd().y);
					if (figure != null) {
						MyCanvas.this.repaint();
					}
				}
			};
			this.addMouseListener(mouseAdapter);
			this.addMouseMotionListener(mouseAdapter);
		}
		
		@Override
		public void paint(Graphics g) {
			super.paint(g);
			for (int i = 0; i < figs.size(); i++) {
				figs.get(i).drawFigure(g, figTypes.get(i));
			}
			figure.drawFigure(g, myActionListener.getValue());
			figs.add(figure);
			figTypes.add(myActionListener.getValue());
		}
		
	}
	
	//按键监听类
	public class MyActionListener implements ActionListener{
		public MyActionListener() {
			jb_cycle.addActionListener(this);
			jb_righttriangle.addActionListener(this);
			jb_square.addActionListener(this);
			jb_color.addActionListener(this);
		}
		private int value = 0; //判断是选择线框还是封闭
		public int getValue() {
			return value;
		}
		
		@Override
		public void actionPerformed(ActionEvent e) {
			if (!e.getActionCommand().equals("颜色")) {
				value = this.select();
				switch (e.getActionCommand()) {
				case "圆形":
					figure = new Cycle();
					break;
				case "正方形":
					figure = new Square();
					break;
				case "直角三角形":
					figure = new RightTriangle();
					break;
				default:
					break;
				}
			}else {
				color = JColorChooser.showDialog(DrawFram.this, "选择颜色", jb_color.getBackground());
				jb_color.setBackground(color);
			}
		}

		private int select() {
			String[] options = {"线框","封闭"};
			int value = JOptionPane.showOptionDialog(DrawFram.this, "请选择要话的类型:", "图形样式", 
					JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE,
					null, options, "线框");
			return value;
		}
	}
	
}

RightTriangle类

import java.awt.Graphics;
import java.awt.Point;
import java.awt.Polygon;

public class RightTriangle extends Figure{
	private Point top;
	private Point right;
	private Point left = new Point();
	double width;
	double height;
	
	@Override
	public void drawFigure(Graphics g, int select) {
		g.setColor(getColor());
		Polygon filledPolygon=new Polygon();
		filledPolygon.addPoint(top.x,top.y);
		filledPolygon.addPoint(right.x,right.y);
		filledPolygon.addPoint(left.x,left.y);
		if (select ==0) {
			g.drawPolygon(filledPolygon);//线框
		}else {
			g.fillPolygon(filledPolygon);//封闭图形
		}
	}

	@Override
	public double getArea() {
		double width = Math.abs(this.left.x - this.right.x);
		double height = Math.abs(this.left.y - this.top.y);
		return width*height/2;
	}

	@Override
	public double getPerimeter() {
		return Math.sqrt(Math.pow(width, 2)+Math.pow(height, 2)) + width + height;
	}

	@Override
	public void setEnd(Point end) {
		super.setEnd(end);
		this.top = getStart();
		this.right = getEnd();
		this.left.x = top.x;
		this.left.y = right.y;
		width = Math.abs(this.left.x - this.right.x);
		height = Math.abs(this.left.y - this.top.y);
	}
}

Square类

import java.awt.Graphics;
import java.awt.Point;

public class Square extends Figure{
	private int length;
	@Override
	public void drawFigure(Graphics g, int select) {
		g.setColor(getColor());
		if (select == 0) {
			g.drawRect(getStart().x, getStart().y, length, length);
		}else {
			g.fillRect(getStart().x, getStart().y, length, length);
		}
	}

	@Override
	public double getArea() {
		// TODO Auto-generated method stub
		return length*length;
	}

	@Override
	public double getPerimeter() {
		// TODO Auto-generated method stub
		return 4*length;
	}

	@Override
	public void setEnd(Point end) {
		super.setEnd(end);
		this.length = Math.abs(getEnd().x - getStart().x);
	}
	
}

Figure类:

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

public abstract class Figure {
	private Point start;//鼠标点下去的起始位置
	private Point end;//鼠标拖拽后的终点位置
	private Color color = Color.black;//设置默认的颜色为黑色
	
	
	public abstract void drawFigure(Graphics g, int select);//定义画图方法
	public abstract double getArea();//计算面积
	public abstract double getPerimeter();//计算周长
	
	public Point getStart() {
		return start;
	}
	public void setStart(Point start) {
		this.start = start;
	}
	public Point getEnd() {
		return end;
	}
	public void setEnd(Point end) {
		this.end = end;
	}
	public Color getColor() {
		return color;
	}
	public void setColor(Color color) {
		this.color = color;
	}
}

Test类:

public class Test {
	public static void main(String[] args) {
		new DrawFram();
	}
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无奈清风吹过

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值