//实现图片的任意拖动 可运行
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
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.JFrame;
public class MainFrame extends JFrame implements MouseListener,MouseMotionListener{
public static void main(String[] args) {
new MainFrame();
}
private static final long serialVersionUID = 1L;
private BufferedImage img; //绘制图片
private boolean isPressImage; //是否操作图片
private int moveSide; //拉升的边(0:移动 1:上 2:下 3:左 4:右)
private Point imagePoint; //图片位置
private int[] imageSize; //图片大小
private Point pressPoint; //press图片时的鼠标位置
public MainFrame(){
setSize(new Dimension(600,400));
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initData();
setVisible(true);
this.getContentPane().addMouseListener(this);
this.getContentPane().addMouseMotionListener(this);
}
private void initData(){
img = new MyBufferedImage().getImage();
imagePoint = new Point(0, 0); //记录图片位置
imageSize = new int[]{img.getWidth(),img.getHeight()}; //记录图片大小
}
/**当前是否操作图片**/
private boolean isContains(Point point){
Rectangle rectangle = new Rectangle();
rectangle.x = imagePoint.x;
rectangle.y = imagePoint.y;
rectangle.width = imageSize[0];
rectangle.height = imageSize[1];
return rectangle.contains(point);
}
/**得到是否是点击的4个边中的1个(0,1,2,3,4)**/
private int getPressSide(Point point){
int side = 0;
Rectangle rectTop = new Rectangle(imagePoint.x+8,imagePoint.y,imageSize[0]-16,8);
Rectangle rectBottom = new Rectangle(imagePoint.x+8,imagePoint.y+imageSize[1]-8,imageSize[0]-16,8);
Rectangle rectLeft = new Rectangle(imagePoint.x,imagePoint.y+8,8,imageSize[1]-16);
Rectangle rectRight = new Rectangle(imagePoint.x+imageSize[0]-8,imagePoint.y+8,8,imageSize[1]-16);
if(rectTop.contains(point)){
setCursor(2);
return 1; //上
}else if(rectBottom.contains(point)){
setCursor(2);
return 2; //下
}else if(rectLeft.contains(point)){
setCursor(4);
return 3; //左
}else if(rectRight.contains(point)){
setCursor(4);
return 4; //右
}
return side; //中间
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
/**把图片所占的矩阵用变量表示出来(便于判断是否操作图片)**/
if(isContains(new Point(e.getPoint().x+4, e.getPoint().y+30))){
moveSide = getPressSide(new Point(e.getPoint().x+4, e.getPoint().y+30)); //记录操作图片的边
isPressImage = true;
pressPoint = e.getPoint();
}else{
isPressImage = false;
}
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
isPressImage = false;
pressPoint = null;
setCursor(0);
}
@Override
public void mouseDragged(MouseEvent arg0) {
// TODO Auto-generated method stub
if(isPressImage){
Point nowPoint = arg0.getPoint(); //当前鼠标拖拽到的鼠标位置
int diffX = nowPoint.x - pressPoint.x;
int diffY = nowPoint.y - pressPoint.y;
/**移动**/
if(moveSide == 0){
setCursor(1);
this.imagePoint.x += diffX;
this.imagePoint.y += diffY;
pressPoint = nowPoint;
}
/**收缩**/
else{
//收缩 下和右时
if(moveSide == 2 || moveSide == 4){
if(moveSide == 2) //拉下(只能拉长拉短)
this.imageSize[1] += diffY;
else //拉右(只能拉宽拉窄)
this.imageSize[0] += diffX;
}
//收缩 上和左时
else if(moveSide == 1 || moveSide == 3){
if(moveSide == 1){ //拉上边(只能拉长拉短)
this.imagePoint.y += diffY;
this.imageSize[1] -= diffY;
}else{ //拉左边(只能拉宽拉窄)
this.imagePoint.x += diffX;
this.imageSize[0] -= diffX;
}
}
pressPoint = nowPoint;
}
repaint();
}
}
@Override
public void mouseMoved(MouseEvent arg0) {
// TODO Auto-generated method stub
}
public void paint(Graphics g){
super.paint(g);
g.drawImage(img, imagePoint.x, imagePoint.y, imageSize[0],imageSize[1], null);
}
public void update(Graphics g){
paint(g);
}
public void repaint(Graphics g){
paint(g);
}
class MyBufferedImage {
private BufferedImage image = new BufferedImage(256, 256, BufferedImage.TYPE_3BYTE_BGR);
public MyBufferedImage(){
File file = new File("map1.jpg");
if(!file.exists())
return;
try {
BufferedImage imageRead = ImageIO.read(file);
Graphics g = image.getGraphics();
g.drawImage(imageRead, 0, 0, imageRead.getWidth(),imageRead.getHeight(), null);
} catch (IOException e) {
e.printStackTrace();
}
}
public BufferedImage getImage(){
return this.image;
}
}
}
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
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.JFrame;
public class MainFrame extends JFrame implements MouseListener,MouseMotionListener{
public static void main(String[] args) {
new MainFrame();
}
private static final long serialVersionUID = 1L;
private BufferedImage img; //绘制图片
private boolean isPressImage; //是否操作图片
private int moveSide; //拉升的边(0:移动 1:上 2:下 3:左 4:右)
private Point imagePoint; //图片位置
private int[] imageSize; //图片大小
private Point pressPoint; //press图片时的鼠标位置
public MainFrame(){
setSize(new Dimension(600,400));
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initData();
setVisible(true);
this.getContentPane().addMouseListener(this);
this.getContentPane().addMouseMotionListener(this);
}
private void initData(){
img = new MyBufferedImage().getImage();
imagePoint = new Point(0, 0); //记录图片位置
imageSize = new int[]{img.getWidth(),img.getHeight()}; //记录图片大小
}
/**当前是否操作图片**/
private boolean isContains(Point point){
Rectangle rectangle = new Rectangle();
rectangle.x = imagePoint.x;
rectangle.y = imagePoint.y;
rectangle.width = imageSize[0];
rectangle.height = imageSize[1];
return rectangle.contains(point);
}
/**得到是否是点击的4个边中的1个(0,1,2,3,4)**/
private int getPressSide(Point point){
int side = 0;
Rectangle rectTop = new Rectangle(imagePoint.x+8,imagePoint.y,imageSize[0]-16,8);
Rectangle rectBottom = new Rectangle(imagePoint.x+8,imagePoint.y+imageSize[1]-8,imageSize[0]-16,8);
Rectangle rectLeft = new Rectangle(imagePoint.x,imagePoint.y+8,8,imageSize[1]-16);
Rectangle rectRight = new Rectangle(imagePoint.x+imageSize[0]-8,imagePoint.y+8,8,imageSize[1]-16);
if(rectTop.contains(point)){
setCursor(2);
return 1; //上
}else if(rectBottom.contains(point)){
setCursor(2);
return 2; //下
}else if(rectLeft.contains(point)){
setCursor(4);
return 3; //左
}else if(rectRight.contains(point)){
setCursor(4);
return 4; //右
}
return side; //中间
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
/**把图片所占的矩阵用变量表示出来(便于判断是否操作图片)**/
if(isContains(new Point(e.getPoint().x+4, e.getPoint().y+30))){
moveSide = getPressSide(new Point(e.getPoint().x+4, e.getPoint().y+30)); //记录操作图片的边
isPressImage = true;
pressPoint = e.getPoint();
}else{
isPressImage = false;
}
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
isPressImage = false;
pressPoint = null;
setCursor(0);
}
@Override
public void mouseDragged(MouseEvent arg0) {
// TODO Auto-generated method stub
if(isPressImage){
Point nowPoint = arg0.getPoint(); //当前鼠标拖拽到的鼠标位置
int diffX = nowPoint.x - pressPoint.x;
int diffY = nowPoint.y - pressPoint.y;
/**移动**/
if(moveSide == 0){
setCursor(1);
this.imagePoint.x += diffX;
this.imagePoint.y += diffY;
pressPoint = nowPoint;
}
/**收缩**/
else{
//收缩 下和右时
if(moveSide == 2 || moveSide == 4){
if(moveSide == 2) //拉下(只能拉长拉短)
this.imageSize[1] += diffY;
else //拉右(只能拉宽拉窄)
this.imageSize[0] += diffX;
}
//收缩 上和左时
else if(moveSide == 1 || moveSide == 3){
if(moveSide == 1){ //拉上边(只能拉长拉短)
this.imagePoint.y += diffY;
this.imageSize[1] -= diffY;
}else{ //拉左边(只能拉宽拉窄)
this.imagePoint.x += diffX;
this.imageSize[0] -= diffX;
}
}
pressPoint = nowPoint;
}
repaint();
}
}
@Override
public void mouseMoved(MouseEvent arg0) {
// TODO Auto-generated method stub
}
public void paint(Graphics g){
super.paint(g);
g.drawImage(img, imagePoint.x, imagePoint.y, imageSize[0],imageSize[1], null);
}
public void update(Graphics g){
paint(g);
}
public void repaint(Graphics g){
paint(g);
}
class MyBufferedImage {
private BufferedImage image = new BufferedImage(256, 256, BufferedImage.TYPE_3BYTE_BGR);
public MyBufferedImage(){
File file = new File("map1.jpg");
if(!file.exists())
return;
try {
BufferedImage imageRead = ImageIO.read(file);
Graphics g = image.getGraphics();
g.drawImage(imageRead, 0, 0, imageRead.getWidth(),imageRead.getHeight(), null);
} catch (IOException e) {
e.printStackTrace();
}
}
public BufferedImage getImage(){
return this.image;
}
}
}