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

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个图形?感觉好麻烦……  应该有更好的办法吧……

时间: 2024-10-21 11:02:53

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

Java 在PDF文档中绘制图形

本篇文档将介绍通过Java编程在PDF文档中绘制图形的方法.包括绘制矩形.椭圆形.不规则多边形.线条.弧线.曲线.扇形等等.针对方法中提供的思路,也可以自行变换图形设计思路,如菱形.梯形或者组合图形等. 使用工具:Free Spire.PDF for Java(免费版) Jar文件导入: 步骤1:将安装包中lib文件夹下的两个文件复制到程序中新建的文件夹中(这里在程序中可新建一个文件夹并命名为Lib) 步骤2:复制文件后,将两个添加引用到程序:选中这两个jar文件,点击鼠标右键,选择"Build

Java 在PPT中绘制图形

Microsoft PowerPoint可支持在幻灯片中插入各种类型的图形并且可设置图形填充.线条颜色.图形大小.位置等.下面将通过Java编程来演示在PPT中绘制图形的方法. 工具:Free Spire.Presentation for Java v 2.2.3 Jar文件导入方法1:通过官网下载,并导入 Step1:创建目录文件lib,并将Spire.Presentation.jar文件导入(可直接复制该文件到lib) Step2: 选中Spire.Presentation.jar,右键,选

韩顺平循序渐进学java 第12讲 多态

12.1 多态-四大特征之四 12.1.1 概念 所谓多态,就是指一个引用(类型)在不同情况下的多种状态. 可以这样理解:多态是指通过指向父类的指针,来调用在不同子类中实现的方法. 12.1.2 注意事项 在讲解多态的时候,我们注意到这样一个现象-类型的转换. 1.java允许父类的引用变量引用它的子类的实例(对象) Animal animal=new Cat(); 2.关于类型转换还有一些细节要求,比如子类能不能转换成父类,有什么要求等等... 多态代码演示: 1 /**日期:2016-03-

JAVA程序设计(12.3)---- 监听器初级应用:五子棋

1.制作五子棋游戏软件 因为老师已经基本做完了,重做的时候快了很多--但是还是感觉思维很混乱-- 哪边先哪边后,哪个方法在哪边好之类的问题 太纠结了-- 先是窗口 内部类:鼠标适配器  窗口的构造器  绘图 package com.lovo.homework2; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.awt.event.MouseAdapter; import jav

JAVA程序设计(09)-----面对对象设计初级应用 龟兔赛跑

1.乌龟和兔子共有属性和方法 做成父类 避免重复代码 package com.lovo; /** * 类: 动物 * @author Abe * 属性: 名字 步距 总距离 睡觉的日子 */ public class Animal { protected String name; protected int step; protected int distance; protected int sleepDay; /** * 构造器 * @param name */ public Animal(

《java程序设计》201671010143 周结(12)

这一周我们学习了图形程序设计的相关内容.重要是学习怎样去构建一个框架,定义一个组件,然后在框架中添加一个组件.之后在更深入的在组件中绘制图形,设置2D图形中的字体格式,以及2D图形的显示方式.这一章的内容让我想起了上学期学习的网页设计,虽然编程语言不一样,但在一些设计以及测绘上都有相似之处. 这一周我最收益的就是测试的内容,通过小测试复习了前四章的内容,并且最后一道题在老师带领下让我对以前有些知识点模糊的地方有了新的认识.也感受到了java给我们带来的便捷,代码在电脑上就很快的能构造出方法,如果

《JAVA程序设计与实例》记录与归纳--继承与多态

继承与多态 概念贴士: 1. 继承,即是在已经存在的类的基础上再进行扩展,从而产生新的类.已经存在的类成为父类.超类和基类,而新产生的类成为子类或派生类. 2. Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类. 3. 继承分为单继承和多重继承.单继承是指一个子类最多只能有一个父类.多继承是一个子类可以有两个以上的父类.Java语言中的类只支持单继承,多继承是通过接口(interface)来间接实现的. 4

Java基础12 类型转换与多态(转载)

类型检查 Java的任意变量和引用经过类型声明(type declaration),才能使用.我们之前见过对象数据.类数据.方法参数.方法返回值以及方法内部的自动变量,它们都需要声明其类型.Java是一种强类型(strongly typing)语言,它会对类型进行检查.如果我们错误的使用类型,将造成错误. 比如在下面的Test类中,我们将一个Cup类对象赋予给aPerson类引用: public class Test{    public static void main(String[] ar

Week12《java程序设计》第12次作业总结

Week12<java程序设计>第12次作业总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2.1 简述如何使用流与文件改造你的系统.文件中数据的格式如何? 答:在注册登录模块中,在用户仓库中无法找到的用户,使用对象流和缓冲流查找对应文件是否存在,不存在就进行注册.从文件中读取影虎的登录信息.登录成功后,使用组合过滤流读取用户的书库信息. 2.2 简述系