📄 bmppanel2.java
字号:
/**
*
* 负责显示位图,支持int[][]的矩阵数组,每一位表示一个像素
*/
import java.awt.image.*;
import java.awt.*;
import java.awt.event.*;
class BMPPanel2 extends Panel implements MouseListener,MouseMotionListener {
//private Color[][] pixel;
Image bmp;
int[] pixel;
private int bmpWidth; //显示的宽
private int bmpHeight; //显示的高
private int bmpRow; //像素的行数
private int bmpCol; //像素的列数
private int newX0 = 0;
private int newY0 = 0;
private int oldX0 = 0;
private int oldY0 = 0;
private int mousePressedX = 0;
private int mousePressedY = 0;
private int mouseReleasedX = 0;
private int mouseReleasedY = 0;
private int mouseDraggedX = 0;
private int mouseDraggedY = 0;
private double zoomSize = 0;
private boolean isDragged = false;
private int drawWhich;
private final int DRAW_BMP = 0;
private final int DRAW_MOVE_BORDER = 1;
private final int DRAW_ZOOM_BORDER = 2;
private final int DRAW_ZOOMING_BORDER = 3;
BMPPanel2() {
this.addMouseListener(this);
this.addMouseMotionListener(this);
}
public BMPPanel2(int[][] data) {
this();
setPixel(data);
}
public void drawBMP(int[][] data,int x,int y,int bmpWidth,int bmpHeight) {
oldX0 = newX0 = x;
oldY0 = newY0 = y;
this.bmpWidth = bmpWidth;
this.bmpHeight = bmpHeight;
setPixel(data);
repaint();
}
public void drawBMP(int[][] data,int x,int y) {
int bmpWidth = data.length;
int bmpHeight = data[0].length;
drawBMP(data,x,y,bmpWidth,bmpHeight);
}
public void drawBMP(int[][] data) {
int bmpHeight = data.length;
int bmpWidth = data[0].length;
int x = (this.getWidth() - bmpWidth) / 2;
int y = (this.getHeight() - bmpHeight) / 2;
drawBMP(data,x,y,bmpWidth,bmpHeight);
}
public void drawBMPBaseBefore(int[][] data) {
drawBMP(data,oldX0,oldY0,bmpWidth,bmpHeight);
}
public void setPixel(int[][] data) {
bmpRow = data.length;
bmpCol = data[0].length;
pixel = new int[bmpCol * bmpRow];
int index = 0;
for (int i = 0; i<bmpRow; i++) {
for (int j = 0; j<bmpCol; j++) {
pixel[index++] = data[i][j];
}
}
ImageProducer ip=new MemoryImageSource(bmpCol,bmpRow,pixel,0,bmpCol) ;
bmp = createImage(ip);
}
public int getBMPX0() {
return newX0;
}
public int getBMPY0() {
return newY0;
}
public int getBMPWidth() {
return bmpWidth;
}
public int getBMPHeight() {
return bmpHeight;
}
public void setDefaultSize() {
bmpWidth = bmpCol;
bmpHeight = bmpRow;
}
public void setDefaultLocation() {
newX0 = (this.getWidth() - bmpWidth) / 2;
newY0 = (this.getHeight() - bmpHeight) / 2;
oldX0 = newX0;
oldX0 = newX0;
}
public void paint(Graphics g) {
if (pixel == null) {
return ;
}
switch(drawWhich) {
case DRAW_BMP : drawBMP(g); break;
case DRAW_MOVE_BORDER : drawMoveBorder(g); break;
case DRAW_ZOOM_BORDER : drawZoomBorder(g); break;
}
}
private void drawMoveBorder(Graphics g) {
g.setColor(Color.GREEN);
g.drawRect(newX0,newY0,bmpWidth,bmpHeight);
}
private void drawZoomBorder(Graphics g) {
g.setColor(Color.BLUE);
g.drawRect(newX0,newY0,bmpWidth,bmpHeight);
g.setColor(Color.PINK);
g.fillRect(newX0+bmpWidth-5,newY0+bmpHeight-5,10,10);
}
private void drawBMP(Graphics g) {
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
g.drawImage(bmp,newX0,newY0,bmpWidth,bmpHeight,Color.RED,this);
}
public void drawReverseBMP() {
}
public void locateToCenter(){}
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() > 1) {
drawWhich = this.DRAW_BMP;
return;
}
mousePressedX = e.getX();
mousePressedY = e.getY();
drawWhich = this.DRAW_ZOOM_BORDER;
}
public void mousePressed(MouseEvent e) {
if (drawWhich == DRAW_ZOOM_BORDER) {
return;
}
mousePressedX = e.getX();
mousePressedY = e.getY();
setCursor(new Cursor(Cursor.MOVE_CURSOR));
drawWhich = this.DRAW_MOVE_BORDER;
}
public void mouseReleased(MouseEvent e) {
if(pixel == null) {
return;
}
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
mouseReleasedX = e.getX();
mouseReleasedY = e.getY();
switch (drawWhich) {
case DRAW_MOVE_BORDER : doWhenMoveOver(); break;
case DRAW_ZOOM_BORDER : doWhenZoomOver(); break;
}
drawWhich = this.DRAW_BMP;
repaint();
}
public void doWhenZoomOver() {
}
public void doWhenMoveOver() {
newX0 = oldX0 + mouseReleasedX - mousePressedX;
newY0 = oldY0 + mouseReleasedY - mousePressedY;
oldX0 = newX0;
oldY0 = newY0;
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
boolean isInZoomRect = false;
public void mouseMoved(MouseEvent e) {
if (this.drawWhich != this.DRAW_ZOOM_BORDER) {
return;
}
int x = e.getX();
int y = e.getY();
int SEX = newX0 + bmpWidth;
int SEY = newY0 + bmpHeight;
if (x > SEX-5 && x < SEX+5 && y > SEY-5 && y < SEY+5) {
this.setCursor(new Cursor(Cursor.SE_RESIZE_CURSOR));
isInZoomRect = true;
} else {
this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
isInZoomRect = false;
}
}
public void mouseDragged(MouseEvent e) {
mouseDraggedX = e.getX();
mouseDraggedY = e.getY();
Cursor cursor = this.getCursor();
if (this.drawWhich == this.DRAW_MOVE_BORDER) {
doWhenMove();
} else if (this.drawWhich == this.DRAW_ZOOM_BORDER && isInZoomRect) {
doWhenZoom();
}
repaint();
}
private void doWhenMove() {
newX0 = oldX0 + mouseDraggedX - mousePressedX;
newY0 = oldY0 + mouseDraggedY - mousePressedY;
}
private void doWhenZoom() {
bmpWidth = mouseDraggedX - newX0;
bmpHeight = mouseDraggedY - newY0;
bmpWidth = bmpWidth < 20 ? 20 : bmpWidth;
bmpHeight = bmpHeight < 20 ? 20 : bmpHeight;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -