最近学了队列,但是并不是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)像上面的一样写好自定义的队列
实现画板重绘就是在事件处理类里面将鼠标选择需要的功能而画出的图存入队列中,然后在主类里面将队列里面的图取出来.这样便实现了画板的重绘.