图片在固定大小的矩形框里显示,对图片放大后,可以进行拖动、或缩小,但是不能让矩形框的底板露出来(用矩阵进行变换,缩放是等倍的请问,有什么简单的方法吗?比如下面这段代码,怎样加上拖放的范围控制呢?(图片放大到一定程度后把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);
    }}

解决方案 »

  1.   

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

  2.   

    还有一个问题“x + 图片width,y + 图片height ”这个是缩放前可以这样判断,缩放后应该乘以缩放的比例然后这个地方,覆盖panel的图片是原图片的一部分是动态截取的
      

  3.   

    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();
      }
      }
      }
      };这样应该可以把?
      

  4.   

    但是有一种情况是没有考虑到得比如现在的JPanel是(400,400)加入我在进行第一次拖动之前已经把图片放大为(800,800)
    那么你这样就不能拖动了 就不能满足条件了?