图片的拖动受范围限制,如何解决

新铺村长 2012-09-17 07:21:34
图片在固定大小的矩形框里显示,对图片放大后,可以进行拖动、或缩小,但是不能让矩形框的底板露出来

(用矩阵进行变换,缩放是等倍的

请问,有什么简单的方法吗?

比如下面这段代码,怎样加上拖放的范围控制呢?(图片放大到一定程度后把Panel全部覆盖,但是在移动的过程中不能把图片的边界一处JPanel的边界)


package map;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class Layer extends JPanel{
private static final long serialVersionUID = 1L;
ImageIcon img = new ImageIcon(Toolkit.getDefaultToolkit().createImage("/root/桌面/2000.jpg"));

//以下两个参数描述图层的位置
private int x = 0;//
private int y = 0;
//以下两个参数描述图层的大小
private int width = 300;
private int height = 300;

//以下两个参数描述图层的每次放大或缩小的尺寸
private int dx = 50;
private int dy = 50;

public Layer(){
this.addMouseWheelListener(new MouseWheelListener() {

public void mouseWheelMoved(MouseWheelEvent e) {
if(e.getWheelRotation() < 0){
zoom();
}else{
reduce();
}

}
});

MouseAdapter ma = new MouseAdapter(){

@Override
public void mouseClicked(MouseEvent e) {
zoom();
}


boolean moveEnable = false;
Point point1 = null;
Point point2 = null;

@Override
public void mousePressed(MouseEvent e) {
moveEnable = true;
point1 = e.getPoint();
}

@Override
public void mouseReleased(MouseEvent e) {
moveEnable = false;
point1 = null;
point2 = null;
}

@Override
public void mouseMoved(MouseEvent e) {
//System.out.println("move");
}
@Override
public void mouseDragged(MouseEvent e) {
System.out.println("dragged");
point2 = e.getPoint();
if(moveEnable){
if(point1 != null && point2 != null){
int dx = point2.x - point1.x;
int dy = point2.y - point1.y;
x = x + dx;
y = y + dy;
//Layer.this.setLocation(_x, _y);
point1 = point2;
repaint();
}
}
}
};

this.addMouseMotionListener(ma);
this.addMouseListener(ma);
}
@Override
public void paint(Graphics g) {
//所有的图层变更都在此方法内响应
super.paint(g);

Graphics2D g2 = (Graphics2D) g;
g2.clearRect(0, 0, getBounds().width, getBounds().height);
g2.drawImage(img.getImage(), x, y, width, height, null);

}

/**
* 缩小
*/
public void reduce(){
if(width > 2*dx && height > 2*dy){
x += dx;
y += dy;
width -= 2 * dx;
height -= 2 * dy;
super.repaint();
}

}

/**
* 放大
*/
public void zoom(){
x -= dx;
y -= dy;
width += 2 * dx;
height += 2 * dy;
super.repaint();
}

/**
* 测试方法
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame f = new JFrame();
f.setLayout(new BorderLayout());
f.setSize(500, 500);

final Layer layer = new Layer();
layer.setBorder(new EmptyBorder(2,2,2,2));
layer.setOpaque(true);
layer.setBackground(Color.BLUE);
layer.setSize(400, 400);
f.getContentPane().add(layer);


JButton btn1 = new JButton("放大");
btn1.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {
layer.zoom();
}
});

JButton btn2 = new JButton("缩小");
btn2.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {
layer.reduce();
}
});
f.add(btn1,BorderLayout.NORTH);
f.add(btn2,BorderLayout.SOUTH);

f.setVisible(true);
}

}
...全文
350 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
新铺村长 2012-09-19
  • 打赏
  • 举报
回复
但是有一种情况是没有考虑到得

比如现在的JPanel是(400,400)

加入我在进行第一次拖动之前已经把图片放大为(800,800)
那么你这样就不能拖动了 就不能满足条件了?
新铺村长 2012-09-19
  • 打赏
  • 举报
回复
厉害 我整了2天了没有搞出来 学习了
fengchunbo 2012-09-19
  • 打赏
  • 举报
回复
public void mouseDragged(MouseEvent e) {
point2 = e.getPoint();
if(moveEnable){
if(point1 != null && point2 != null){
int dx = point2.x - point1.x;
int dy = point2.y - point1.y;

if(x + dx < 0 || y + dy < 0 || x + dx + width > getWidth() || y + dy + height > getHeight()) {
return;
}

x = x + dx;
y = y + dy;
//Layer.this.setLocation(_x, _y);
point1 = point2;
repaint();
}
}
}
};

这样应该可以把?
新铺村长 2012-09-19
  • 打赏
  • 举报
回复
还有一个问题“x + 图片width,y + 图片height ”这个是缩放前可以这样判断,缩放后应该乘以缩放的比例然后这个地方,覆盖panel的图片是原图片的一部分是动态截取的
新铺村长 2012-09-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

在mouseDragged里面去check x,y坐标是否小于0,还有x + 图片width,y + 图片height 是否小于panel的width和height不就行了么,如果小于的话才让它drag。
[/Quote]

对,但是问题是怎样来获得图片上的某个点的坐标呢?(这个点是左上角的顶点吧)
fengchunbo 2012-09-19
  • 打赏
  • 举报
回复
在mouseDragged里面去check x,y坐标是否小于0,还有x + 图片width,y + 图片height 是否小于panel的width和height不就行了么,如果小于的话才让它drag。
新铺村长 2012-09-18
  • 打赏
  • 举报
回复
自己顶一下 苦等中
新铺村长 2012-09-18
  • 打赏
  • 举报
回复
没人知道?还是都去收复钓鱼岛去了?
新铺村长 2012-09-17
  • 打赏
  • 举报
回复
有没有人知道怎么搞呢?

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧