⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainpanel.java

📁 java课的作业
💻 JAVA
字号:
/*
 * Created on 2005-3-31
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package bubbletea;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.AreaAveragingScaleFilter;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageProducer;
import java.awt.image.MemoryImageSource;
import java.awt.image.PixelGrabber;
import java.awt.*;
import java.io.File;
import java.io.IOException;

/**
 * @author roger
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class MainPanel extends JPanel{
	private final int MAXNUM = 10000;
	static final int PEN = 0;
	static final int LINE = 1;
	static final int ERASER = 2;
	static final int RECT = 3;
	static final int CIRCLE = 4;
	static final int CUTTER = 5;
	
	private JLabel status = null;
	Shape[] item = new Shape[MAXNUM];
	int index = 0;
	private int type = PEN;
	private float stroke;
	private int R,G,B;
	private Image image = null;
	private BufferedImage copy = null;
	private int x;
	private int y;
	private File file = null;
	private Color color = Color.WHITE;
	
	void changeR()
	{
		change(-3.14/8,400,0);
	}
	void changeL()
	{
		change(3.14/8,0,400);
	}
	
	void scaleX()
	{
		scale(1.5,1);
	}
	void scaleY()
	{
		scale(1,1.5);
	}
	void scale(double xp,double yp)
	{
		BufferedImage biSrc, biDes;
		Graphics2D big;
		
		biSrc = new BufferedImage(image.getWidth(null), image.getHeight(null),BufferedImage.TYPE_INT_ARGB);
		big = biSrc.createGraphics();
		big.drawImage(image,0,0,this);
		biDes = new BufferedImage(getWidth(), getHeight(),BufferedImage.TYPE_INT_ARGB);
	
		AffineTransform transform = new AffineTransform();
		transform.setToScale(xp,yp);
		 
		AffineTransformOp op = new AffineTransformOp(transform,null);	       
	    op.filter(biSrc,biDes);
	    image = biDes;
	       
	    repaint();
	}
	
	void change(double r,int xp,int yp)
	{
		BufferedImage biSrc, biDes;
		Graphics2D big;
		
		biSrc = new BufferedImage(image.getWidth(null), image.getHeight(null),BufferedImage.TYPE_INT_ARGB);
		big = biSrc.createGraphics();
		big.drawImage(image,0,0,this);
		biDes = new BufferedImage(getWidth(), getHeight(),BufferedImage.TYPE_INT_ARGB);
	
		AffineTransform transform = new AffineTransform();
		transform.rotate(r,xp,yp);
		 
		AffineTransformOp op = new AffineTransformOp(transform,null);	       
	    op.filter(biSrc,biDes);
	    image = biDes;
	       
	    repaint();
	}
	
	void setPaneColor(Color c)
	{
		color = c;
	}
	
	void setFile(File f)
	{
		if(f != null)
			file = f;
	}
	
	void cut()
	{
		int x1 = 0,x2 = 0,y1 = 0,y2 = 0;
		int i;
		for(i = index; i > 0; i --)
		{
			if(item[i] instanceof Cutter)
			{
				x1 = item[i].x1;
				x2 = item[i].x2;
				y1 = item[i].y1;
				y2 = item[i].y2;
				break;
			}
		}
		if(i > 0)
		{
			int x = ((x1 - x2) >= 0)?x2:x1;
			int y = ((y1 - y2) >= 0)?y2:y1;
			CropImageFilter filter = new CropImageFilter(x,y,Math.abs(x2-x1),Math.abs(y2-y1));   
			FilteredImageSource fis = new FilteredImageSource(image.getSource(),filter);
			image = createImage(fis);   
			item[i] = null;
			repaint();	
		}
		type = PEN;
	}
	
	void zoomToHalf()
	{
		AreaAveragingScaleFilter filter = new AreaAveragingScaleFilter(image.getWidth(null)/2,image.getHeight(null)/2);
		FilteredImageSource fis = new FilteredImageSource(image.getSource(),filter);
		image = createImage(fis);
		repaint();
	}
	void zoomToDouble()
	{
		AreaAveragingScaleFilter filter = new AreaAveragingScaleFilter(image.getWidth(null)*2,image.getHeight(null)*2);
		FilteredImageSource fis = new FilteredImageSource(image.getSource(),filter);
		image = createImage(fis);
		repaint();
	}
	
	void recover()
	{
		image = copy;
		repaint();
		try
		{
			copy = ImageIO.read(file);
		}
		catch(IOException ioe)
		{
			ioe.printStackTrace();
		}
	}
	
	void catchBlue()
	{
		int shiftR = 8;
		int shiftG = 0;
		int shiftB = 16;
		catchPels(shiftR,shiftG,shiftB);
	}
	
	void catchGreen()
	{	
		int shiftR = 16;
		int shiftG = 8;
		int shiftB = 0;
		catchPels(shiftR,shiftG,shiftB);
	}
	
	void catchRed()
	{
		int shiftR = 0;
		int shiftG = 16;
		int shiftB = 8;
		catchPels(shiftR,shiftG,shiftB);
	}
	
	void catchPels(int r,int g,int b)
	{
		int x,w,h;
		int[] pixels;
		
		w = image.getWidth(this);
	    h = image.getHeight(this);
	    pixels = new int[w*h];
	    
	    try{
	        PixelGrabber pg = new PixelGrabber(image,0,0,w,h,pixels,0,w);

	        pg.grabPixels();  
	      }catch(InterruptedException e){e.printStackTrace();}
	      
	      ColorModel  cm = ColorModel.getRGBdefault();
	      for (x=0;x<w*h; x++)
	      {
	        int alpha = 100;
	        int red = cm.getRed(pixels[x]);
	        int green = cm.getGreen(pixels[x]);
	        int blue = cm.getBlue(pixels[x]);
	        pixels[x] = alpha<<24|red<<r|green<<g|blue<<b;        	   
	      }

       ImageProducer ip = new MemoryImageSource(w,h,pixels,0,w);   
       image = createImage(ip);   
	   repaint();
	}
	
	Image getImage()
	{
		return image;
	}
	
	void loadImage(BufferedImage i,BufferedImage j,int x,int y)
	{	
			image = i;
			copy = j;
			this.x = x;
			this.y = y;
	}
	
	void clear()
	{
		for(int i = 1; i < index; i ++)
			item[i] = null;
		index = 0;
		image = null;
		repaint();
	}
	void setColor(int R,int G,int B)
	{
		this.R = R;
		this.G = G;
		this.B = B;
	}	
	void setType(int toType)
	{
		type = toType;
	}
	void setStroke(float s)
	{
		stroke = s;
	}
	
	public void paintComponent(Graphics g) 
	{	
		super.paintComponent(g);
		if(image != null)
		{
			g.drawImage(image,x,y,this);
		}
		for(int i = 1; i <= index; i ++)
		{
			if(item[i] != null)
				item[i].draw((Graphics2D)g);
		}	
	}
	
	private void createItem()
	{
		switch(type)
		{
			case LINE:
			case PEN:
			{
				index ++;
				item[index] = new Line();
				item[index].stroke = stroke;
				item[index].R = R;
				item[index].G = G;
				item[index].B = B;
				break;
			}
			case ERASER:
			{
				
				index ++;
				item[index] = new Line();
				item[index].stroke = 10;
				item[index].R = color.getRed();
				item[index].G = color.getGreen();
				item[index].B = color.getBlue();
				break;
			}
			case RECT:
			{
				index ++;
				item[index] = new Rect();
				item[index].stroke = stroke;
				item[index].R = R;
				item[index].G = G;
				item[index].B = B;
				break;
			}
			case CIRCLE:
			{
				index ++;
				item[index] = new Circle();
				item[index].stroke = stroke;
				item[index].R = R;
				item[index].G = G;
				item[index].B = B;
				break;
			}
			case CUTTER:
			{
				index ++;
				item[index] = new Cutter();
				item[index].stroke = stroke;
				item[index].R = R;
				item[index].G = G;
				item[index].B = B;
				break;
			}
		}
	}
	
	public MainPanel(JLabel status)
	{
		this.status = status;
		setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
		setBackground(Color.white);
		addMouseListener(new Mouse());
		addMouseMotionListener(new MouseMotion());
	}
	
	class Mouse extends MouseAdapter
	{
		/* (non-Javadoc)
		 * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
		 */
		public void mouseEntered(MouseEvent e) {
			status.setText("Cursor's Position is: ( " + e.getX() + ", " + e.getY() + " )");
		}
		/* (non-Javadoc)
		 * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
		 */
		public void mousePressed(MouseEvent e) {
			status.setText("Cursor's Position is: ( " + e.getX() + ", " + e.getY() + " )");
			switch(type)
			{
				case ERASER:
				case PEN:
				{
					createItem();
					item[index].x1 = item[index].x2 = e.getX();
					item[index].y1 = item[index].y2 = e.getY();			
					break;
				}
				case CUTTER:
				case CIRCLE:
				case RECT:
				case LINE:
				{
					createItem();
					item[index].x1 = e.getX();
					item[index].y1 = e.getY();
					break;
				}
			}
		}
		/* (non-Javadoc)
		 * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
		 */
		public void mouseReleased(MouseEvent e) {
			status.setText("Cursor's Position is: ( " + e.getX() + ", " + e.getY() + " )");
		}
		
		/* (non-Javadoc)
		 * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
		 */
		public void mouseExited(MouseEvent e) {
			status.setText("Roger's platform !");
		}
	}
	
	class MouseMotion extends MouseMotionAdapter
	{
		
		/* (non-Javadoc)
		 * @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
		 */
		public void mouseDragged(MouseEvent e) {
			status.setText("Cursor's Position is: ( " + e.getX() + ", " + e.getY() + " )");
			switch(type)
			{
				case ERASER:
				case PEN:
				{
					createItem();
					item[index - 1].x2 = e.getX();
					item[index - 1].y2 = e.getY();
					item[index].x1 = item[index].x2 = e.getX();
					item[index].y1 = item[index].y2 = e.getY();
					repaint();
					break;
				}
				case CUTTER:
				{
					item[index].x2 = e.getX();
					item[index].y2 = e.getY();
					for(int i = index - 1; i > 0; i --)
					{
						if(item[i] instanceof Cutter)
							item[i] = null;
						break;
					}
					repaint();
					break;
				}
				case CIRCLE:
				case RECT:
				case LINE:
				{
					item[index].x2 = e.getX();
					item[index].y2 = e.getY();
					repaint();
					break;
				}
			}
		}
		/* (non-Javadoc)
		 * @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
		 */
		public void mouseMoved(MouseEvent e) {
			status.setText("Cursor's Position is: ( " + e.getX() + ", " + e.getY() + " )");
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -