📄 mainpanel.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 + -