📄 imagepanel.java
字号:
package org.p3p.net.common;import java.awt.BasicStroke;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Image;import java.awt.MediaTracker;import java.awt.Point;import java.awt.Rectangle;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseMotionListener;import java.awt.image.BufferedImage;import javax.swing.JPanel;import javax.swing.SwingUtilities;/** * 带背景面板 */public class ImagePanel extends JPanel implements MouseMotionListener, MouseListener { private Image bg; private boolean paintBG = true; private boolean paintSelectFlag = false; private Rectangle rect = null, rectL_T, rectR_B, rectR_T, rectL_B;// 选择范围 private int lineSize = 10; private int dragTarget = -1;// 左上角 private Point pyPoint = new Point(0, 0), txpyPoint = new Point(0, 0); /** * Create the panel */ public ImagePanel() { super(); // } public ImagePanel(String img) { super(); setOpaque(true); MediaTracker mt = new MediaTracker(this); bg = UIHelper.getImage(img); mt.addImage(bg, 1); try { mt.waitForAll(); } catch (InterruptedException e) { e.printStackTrace(); } addMouseMotionListener(this); addMouseListener(this); } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; super.paintComponent(g2); // 执行一些初始化 if (rect == null) { rect = new Rectangle(0, 0, 80, 80); rect.x = (getWidth() - 80) / 2; rect.y = (getHeight() - 80) / 2; // 当选择框变化时,需要及时更新此两个框的X,Y rectL_T = new Rectangle(rect.x, rect.y, lineSize, lineSize); rectR_B = new Rectangle(rect.x + rect.width - lineSize, rect.y + rect.height - lineSize, lineSize, lineSize); rectR_T = new Rectangle(rect.x + rect.width - lineSize, rect.y, lineSize, lineSize); rectL_B = new Rectangle(rect.x, rect.y + rect.height - lineSize, lineSize, lineSize); } if (paintBG) { // 只绘制部分图像 g2.drawImage(bg, 0, 0, getWidth(), getHeight(), txpyPoint.x / 10, txpyPoint.y / 10, txpyPoint.x / 10 + getWidth(), txpyPoint.y / 10 + getHeight(), null); if (paintSelectFlag) { // 画选择范围 // g2.setColor(new Color(0x336699)); g2.setStroke(new BasicStroke(4)); // 左上 g2.drawLine(rect.x, rect.y, rect.x, rect.y + lineSize); g2.drawLine(rect.x, rect.y, rect.x + lineSize, rect.y); // 右上 g2.drawLine(rectR_T.x, rectR_T.y, rectR_T.x + rectR_T.width, rectR_T.y); g2.drawLine(rectR_T.x + rectR_T.width, rectR_T.y, rectR_T.x + rectR_T.width, rectR_T.y + rectR_T.height); // 左下 g2.drawLine(rectL_B.x, rectL_B.y, rectL_B.x, rectL_B.y + rectL_B.height); g2.drawLine(rectL_B.x, rectL_B.y + rectL_B.height, rectL_B.x + rectL_B.width, rectL_B.y + rectL_B.height); // 右下 g2.drawLine(rect.x + rect.width - lineSize, rect.y + rect.height, rect.x + rect.width, rect.y + rect.height); g2.drawLine(rect.x + rect.width, rect.y + rect.height - lineSize, rect.x + rect.width, rect.y + rect.height); } } } /** * * @param x * @param y * @param r * @return */ private boolean inRectangle(int x, int y, Rectangle r) { return x > r.x && x < r.x + r.width && y > r.y && y < r.y + r.height; } /** * * @param bg */ public void setBackground(Image bg) { this.bg = null; this.bg = bg; } public boolean isPaintBG() { return paintBG; } public void setPaintBG(boolean paintBG) { this.paintBG = paintBG; } public boolean isPaintSelectFlag() { return paintSelectFlag; } public void setPaintSelectFlag(boolean paintSelectFlag) { this.paintSelectFlag = paintSelectFlag; } public Rectangle getRect() { return rect; } public void setRect(Rectangle rect) { this.rect = rect; } public void mouseDragged(MouseEvent e) { // TODO 自动生成方法存根 if (dragTarget < 0) { return; } else if (dragTarget == 0) { rectL_T.x = e.getX() - pyPoint.x; rectL_T.y = e.getY() - pyPoint.y; // 调整相关节点位置 rectR_T.y = rectL_T.y; rectL_B.x = rectL_T.x; rect.width += rect.x - rectL_T.x; rect.height += rect.y - rectL_T.y; rect.x = rectL_T.x; rect.y = rectL_T.y; } else if (dragTarget == 3) { rectR_B.x = e.getX() - pyPoint.x; rectR_B.y = e.getY() - pyPoint.y; // 调整相关节点位置 rectR_T.x = rectR_B.x; rectL_B.y = rectR_B.y; rect.width += rectR_B.x + rectR_B.width - rect.x - rect.width; rect.height += rectR_B.y + rectR_B.height - rect.y - rect.height; } else if (dragTarget == 4) { rect.x = e.getX() - pyPoint.x; rect.y = e.getY() - pyPoint.y; // 需要修改四个 rectL_T.x = rect.x; rectL_T.y = rect.y; rectR_T.x = rect.x + rect.width - lineSize; rectR_T.y = rect.y; rectL_B.x = rect.x; rectL_B.y = rect.y + rect.height - lineSize; rectR_B.x = rect.x + rect.width - lineSize; rectR_B.y = rect.y + rect.height - lineSize; } else if (dragTarget == 9) { txpyPoint.x -= e.getX() - pyPoint.x; txpyPoint.y -= e.getY() - pyPoint.y; } } public void mouseMoved(MouseEvent e) { // TODO 自动生成方法存根 } public void mouseClicked(MouseEvent e) { // TODO 自动生成方法存根 } public void mouseEntered(MouseEvent e) { // TODO 自动生成方法存根 } public void mouseExited(MouseEvent e) { // TODO 自动生成方法存根 } public void mousePressed(MouseEvent e) { // TODO 自动生成方法存根 dragTarget = -1; if (!paintSelectFlag) { dragTarget = 9; pyPoint.x = e.getX(); pyPoint.y = e.getY(); return; } if (inRectangle(e.getX(), e.getY(), rectL_T)) { dragTarget = 0; pyPoint.x = e.getX() - rectL_T.x; pyPoint.y = e.getY() - rectL_T.y; } else if (inRectangle(e.getX(), e.getY(), rectR_T)) { dragTarget = 1; pyPoint.x = e.getX() - rectR_T.x; pyPoint.y = e.getY() - rectR_T.y; } else if (inRectangle(e.getX(), e.getY(), rectL_B)) { dragTarget = 2; pyPoint.x = e.getX() - rectL_B.x; pyPoint.y = e.getY() - rectL_B.y; } else if (inRectangle(e.getX(), e.getY(), rectR_B)) { dragTarget = 3; pyPoint.x = e.getX() - rectR_B.x; pyPoint.y = e.getY() - rectR_B.y; } else if (inRectangle(e.getX(), e.getY(), rect)) { dragTarget = 4; pyPoint.x = e.getX() - rect.x; pyPoint.y = e.getY() - rect.y; } else { dragTarget = 9; pyPoint.x = e.getX(); pyPoint.y = e.getY(); } } public void mouseReleased(MouseEvent e) { // TODO 自动生成方法存根 if (dragTarget > -1) { SwingUtilities.updateComponentTreeUI(this); pyPoint.x = 0; pyPoint.y = 0; dragTarget = -1; } } private Object obj = new Object(); public void changeBGSize(int flag) { float zl = 1 + flag * 0.1f; int w = (int) (bg.getWidth(this) * zl), h = (int) (bg.getHeight(this) * zl); if (w <= 0 || h <= 0) { return; } synchronized (obj) { Image __bg = bg.getScaledInstance(w, h, Image.SCALE_SMOOTH); setBackground(__bg); repaint(); } } /** * 返回选择图像 * * @return */ public BufferedImage getSelectedImage() { // 取得选择的图像 Rectangle selectedRect = null; if (!paintSelectFlag) { selectedRect = new Rectangle(0, 0, getWidth(), getHeight()); } else { selectedRect = rect; } BufferedImage img = new BufferedImage(selectedRect.width, selectedRect.height, BufferedImage.TYPE_3BYTE_BGR); Graphics2D g = (Graphics2D) img.getGraphics(); // 只画局部 需要添加偏移量 g.drawImage(bg, 0, 0, selectedRect.width, selectedRect.height, selectedRect.x + txpyPoint.x / 10, selectedRect.y + txpyPoint.y / 10, selectedRect.x + selectedRect.width + txpyPoint.x / 10, selectedRect.y + selectedRect.height + txpyPoint.y / 10, null); g = null; return img; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -