キューの個人的な理解


最近はキューを勉強しましたが、Queではなく、カスタムキューです。カスタムキューの手順は、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)上のようにカスタムキューを書く
 
絵を描くということは、イベントハンドラでマウスの選択に必要な機能を使って描いた図をキューに入れ、メインクラスでキューの中の図を取り出します。