`

对队列的个人理解

阅读更多

最近学了队列,但是并不是Queue,而是自定义队列.
自定义队列的步骤是:
1.定义一个接口,将需要的方法写好放在里面

/*
 * 自定义队列的接口
 */
public interface ArrayList<E> {

	public void add(E e);//向队列中添加E
	
	public int size();//队列的大小
	
	public 	E get(int index);//得到指定索引的E
	
}

 
2.创建一个类并继承那个接口,然后将方法按照需要的用途写出来

public class ArrayListUse<E> implements ArrayList<E>{

	//定义一个数组,数组的长度为0
	private Object array[];
	//定义size,表示数组的长度
	private int size;
	
	//构造方法
	public ArrayListUse(){
		array = new Object[0];
	}
	
	//构造方法
	public ArrayListUse(int length){
		array = new Object[length];
	}
	
	//添加元素的方法
	public void add(Object e) {
		//定义一个数组,用来存放要加的元素
		Object[] temparray = new Object[array.length+1];
		//将原来的数组存入这个数组中
		for(int i=0;i<array.length;i++){
			temparray[i]=array[i];
		}
		//将要添加的e存入temparray数组中
		temparray[array.length]=e;
		//指原数组的新长度
		size++;
		//将array指向添加元素进去的数组的地址
		array=temparray;
	}


	//获取指定位置元素的方法
	public E get(int index) {
		return (E)array[index];
	}

	//获取数组长度的方法
	public int size() {
		return size;
	}

}

 
3.在需要用到队列的主类里面使用即可

 

于是,做了个小练习,使用队列实现画板的重绘

(共写了5个类,用来实现画板的重绘)

  (1)主类:

package 队列;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

//定义一个画板类
public class DrawBorder extends JFrame{
	//程序的入口主函数
	public static void main(String [] args){
		//实例化一个画板类对象
		DrawBorder bd = new DrawBorder();
		bd.initUI();//方法
		
	}
	
	//定义一个全局变量存储图形的属性
	private String shapeType = "Line";
	
	public String getShapeType() {
		return shapeType;
	}
	
	//实例化一个队列
	ArrayListUse<Draw> array = new ArrayListUse<Draw>();

	public void initUI(){
		//设置窗体属性
		this.setSize(800,600);//大小
		this.setLocationRelativeTo(null);//设置居中
		this.setResizable(false);//设置不可改变窗体大小
		this.setDefaultCloseOperation(3);//设置窗体关闭时退出程序
		
		
		JPanel eastJP = new JPanel();//实例化一个北边面板
		eastJP.setPreferredSize(new Dimension(120,0));
		
		//给窗体设置一个菜单
		JMenuBar jmb = new JMenuBar();
//		jmb.setPreferredSize(new Dimension(0,20));
		JMenu menu = new JMenu("菜单");
		JMenuItem save = new JMenuItem("保存");
		menu.add(save);
		JMenuItem open = new JMenuItem("打开");
		menu.add(open);
		jmb.add(menu);
		this.add(jmb,BorderLayout.SOUTH);
		
		
		
		
		//给窗体添加按钮
		JButton butLine = new JButton("直线");
		JButton butRect = new JButton("矩形");
		JButton butOval = new JButton("椭圆形");
		JButton butRoundRect = new JButton("圆角矩形");
		JButton butTrian = new JButton("等腰三角形");
		JButton butTriangel = new JButton("任意三角形");
		
		eastJP.add(butLine);
		eastJP.add(butRect);
		eastJP.add(butOval);
		eastJP.add(butRoundRect);
		eastJP.add(butTrian);
		eastJP.add(butTriangel);
		
		//使用匿名内部类处理
		ActionListener ac = new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				shapeType = e.getActionCommand();
				System.out.println("你点击了"+shapeType+"按钮!");
			}
		};
		
		//将监听器加到按钮上
		butLine.addActionListener(ac);
		butRect.addActionListener(ac);
		butOval.addActionListener(ac);
		butRoundRect.addActionListener(ac);
		butTrian.addActionListener(ac);
		butTriangel.addActionListener(ac);
				
		this.add(eastJP,BorderLayout.EAST);//将此面板添加到窗体上
		
		//创建一个画图的面板
		JPanel drawPanel = new JPanel();
		drawPanel.setBackground(Color.white);
		this.add(drawPanel,BorderLayout.CENTER);
		
		this.setVisible(true);//设置窗体可见
		
		//在窗体可见之后获取画板
		Graphics g = drawPanel.getGraphics();
		
		//创建绘制图形的处理类
		DrawListener dl = new DrawListener(g,this,drawPanel,array);
		drawPanel.addMouseListener(dl);
		//实例化一个菜单处理类
		FileOperation fo = new FileOperation(array,g);
		//给菜单加上监听器
		save.addActionListener(fo);
		open.addActionListener(fo);
		
	}
	

	//重绘的方法
	public void paint(Graphics g){
		super.paint(g);  
	    for (int i = 0; i < array.size(); i++) {  
	    	// 将队列中的图形画出来  
	    	 (array.get(i)).draw(g);  
	    }
	
	
	
	}
}

 (2)创建一个事件处理类,用来监听鼠标的行为

 (3)创建一个画图类,里面实现画板的功能

public class Draw /*implements drawKind*/{

	private int x1,y1,x2,y2;
//	private Graphics g;
	String shapeType;
	
	//构造方法
	public Draw(int x1,int y1,int x2,int y2,String shapeType){
		this.x1 = x1;
		this.y1 = y1;
		this.x2 = x2;
		this.y2 = y2;
//		this.g = g;
		this.shapeType = shapeType;
	}
	
	//画图的方法
	public void draw(Graphics g){
		if(shapeType.equals("直线")){
			drawline(g);
		}else if(shapeType.equals("矩形")){
			drawrect(g);
		}else if(shapeType.equals("椭圆形")){
			drawoval(g);
		}else if(shapeType.equals("圆角矩形")){
			drawroundrect(g);
		}else if(shapeType.equals("等腰三角形")){
			drawtrian(g);
		}
	}
	
	//画直线的方法
	public void drawline(Graphics g) {
		g.drawLine(x1, y1, x2, y2);
	}

	//画椭圆的方法
	public void drawoval(Graphics g) {
		g.drawOval(x1, y1, Math.abs(x1-x2), Math.abs(y1-y2));
	}

	//画矩形的方法
	public void drawrect(Graphics g) {
		g.drawRect(x1, y1, Math.abs(x1-x2), Math.abs(y1-y2));
	}

	//画圆角矩形的方法
	public void drawroundrect(Graphics g) {
		g.drawRoundRect(x1, y1, Math.abs(x1-x2), Math.abs(y1-y2), 30, 30);
	}

	//画等腰三角形的方法
	public void drawtrian(Graphics g) {
		 Graphics2D g2d = (Graphics2D) g;          
		 GeneralPath path = new GeneralPath();   
		 path.moveTo(x1, y1);           
		 path.lineTo(x2, y2);           
		 path.lineTo(2*x1-x2, y2);      
		 path.moveTo(2*x1-x2, y2);
		 path.lineTo(x1, y1);
		 g2d.draw(path);
	}
	
	public int getX1() {
		return x1;
	}

	public int getY1() {
		return y1;
	}

	public int getX2() {
		return x2;
	}

	public int getY2() {
		return y2;
	}

	public String getShapeType() {
		return shapeType;
	}

}

  (4)像上面的一样写好自定义的队列

 

实现画板重绘就是在事件处理类里面将鼠标选择需要的功能而画出的图存入队列中,然后在主类里面将队列里面的图取出来.这样便实现了画板的重绘.

1
2
分享到:
评论

相关推荐

    PHP PDO和消息队列的个人理解与应用实例分析

    本文实例讲述了PHP PDO和消息队列的个人理解与应用。分享给大家供大家参考,具体如下: 什么是消息队列,百度百科说,···消息队列····是在消息的传输过程中保存消息的容器。 看着网上林林总总的文章,都说是...

    北京工业大学 数据结构与算法 (电控学院) 第四章栈和队列作业

    北京工业大学,电控学院,《数据结构与算法》。本资源是北工大电控学院大一下学期课程《数据结构与...本代码为上传者原创,仅供个人学习参考使用,请勿自行在其他网站及论坛发布,作者在此对访问本资源的同学表示感谢。

    队列操作的验证及应用

    2、实验目的:加深理解循环队列的定义;掌握顺序循环队列的表示与实现。 3、实验内容: 设有N个人站成一排,从左到右的编号分别为1——N,现在从左往右报数“1,2,3,1,2,3。。。”,数到1的人出列,数到2和3的人...

    php+redis实现消息队列功能示例

    个人理解在项目中使用消息队列一般是有如下几个原因: 把瞬间服务器的请求处理换成异步处理,缓解服务器的压力 实现数据顺序排列获取 redis实现消息队列步骤如下: 1).redis函数rpush,lpop 2).建议定时任务入队列 ...

    springboot使用多线程和redis队列模拟售票.zip

    毕业设计是高等教育阶段学生在完成学业前所进行的一项重要学术任务,旨在检验学生通过学习所获得的知识、技能以及对特定领域的深刻理解能力。这项任务通常要求学生运用所学专业知识,通过独立研究和创新,完成一个...

    《程序员面试代码指南——IT名企算法与数据结构题目最优解》、个人面试算法练习.zip

    数据结构是计算机存储、组织数据的方式,它涉及到数据的逻辑结构、物理结构以及对数据的基本操作。...通过对数据结构的理解和运用,以及对算法的学习和研究,可以帮助我们更有效地解决实际问题,提升编程能力。

    Android 项目优化、面试题集,包含Android、Java、数据结构、算法、个人blog备份等。.zip

    数据结构是计算机存储、组织数据的方式,它涉及到数据的逻辑结构、物理结构以及对数据的基本操作。...通过对数据结构的理解和运用,以及对算法的学习和研究,可以帮助我们更有效地解决实际问题,提升编程能力。

    彻底理解AndroidBinder通信架构

    从我个人的理解角度,曾尝试着在知乎回答同样一个问题为什么Android要采用Binder作为IPC机制?.这是我第一次认认真真地在知乎上回答问题,收到很多网友的点赞与回复,让我很受鼓舞,也决心分享更多优先地文章回报读者和...

    这是《Java软件结构与数据结构》第四版的队列案例——售票口模拟.zip

    毕业设计是高等教育阶段学生在完成学业前所进行的一项重要学术任务,旨在检验学生通过学习所获得的知识、技能以及对特定领域的深刻理解能力。这项任务通常要求学生运用所学专业知识,通过独立研究和创新,完成一个...

    操作系统大报告——进程管理实验报告+内含实现代码(创建、撤销、调度、阻塞、唤醒进程等功能)、个人心得、运行结果截图

    以加深对进程的概念及进程调度算法的理解,并且提高链表的应用能力,达到提高编程能力的目的。 二、 实验原理及基本技术路线图(方框原理图) 用C语言或C++语言开发。需要定义PCB的数据结构,用链表的形式管理进程,...

    基于SpringBoot框架开发的学生选课管理系统 附带详细运行指导视频

    首先,这个项目页面简洁清爽,代码注释详尽,易于理解和学习。其次,这个项目涉及到SpringSecurity整合JWT以及消息队列RabbitMQ和Excel处理工具EasyPoi等等技术亮点。 项目功能:此项目分为三个角色:学生、老师和...

    浅谈setTimeout 与 setInterval

    个人理解,如果有错误的地方还请指出。THX  要想理解JavaScript的定时器是如何工作的,先要明白 JavaScript 引擎是单线程的。这个可以理解为 javascript 引擎是一个服务员,它有一个服务的队列,所有的界面元素事件...

    纪录个人学习纪录,数据结构算法和leetcode.zip

    逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何...

    Python Web开发实战 __豆瓣工程师编写

    这本书将作者这些年使用Python进行Web开发,对各方面知识的理解和积累的经验进行梳理和总结。 作者个人博客是http://www.dongwm.com,Github地址为https://github.com/dongweiming 《Python Web开发实战》按照一个...

    数据结构 实例源代码

    数据结构里比较全面的示例了,有链表、队列、栈、哈希表等例子,个人感觉还是不错的。不过大多程序运行时没有操作提示,需要使用者好好去理解源代码额~~

    数据结构实验

    1.任意输入队列长度和队列中的元素值,构造一个顺序循环队列,对其进行清空、插入新元素、返回队头元素以及删除队头元素操作。 2.约瑟夫环的实现:设有n个人围坐在圆桌周围,现从某个位置 i 上的人开始报数,数到 ...

Global site tag (gtag.js) - Google Analytics