注意
完成实验报告及源码链接: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();
}
}