如http://nationalgallery.org.uk/cgi-bin/WebObjects.dll/CollectionPublisher.woa/wa/loadApplet?workNumber=NG6588&collectionPublisherSection=work中的图片拖动缩放功能,请各位高手帮忙看看,谢谢!

解决方案 »

  1.   

    import java.awt.*;
    import java.awt.event.MouseEvent;import javax.swing.*;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    import javax.swing.event.MouseInputListener;public class NavigateTest
    { public static void main(String[] args)
    {
    JLabel label = new JLabel(new ImageIcon(NavigateTest.class.getResource("/preview/test0.jpg"))); JScrollPane sp = new JScrollPane(label);
    NavigateView nv = new NavigateView(sp, label, 0.2);
    JPanel p = new JPanel();
    p.add(nv);
    nv.setBorder(BorderFactory.createLineBorder(Color.black)); JFrame f = new JFrame("NavigateTest");
    f.getContentPane().add(sp, BorderLayout.CENTER);
    f.setSize(500, 400);
    f.setLocation(200, 200);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true); JFrame nf = new JFrame("NavigateView");
    nf.getContentPane().add(p, BorderLayout.CENTER);
    nf.pack();
    nf.setLocation(f.getX() + f.getWidth(), f.getY());
    nf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    nf.setVisible(true);
    } private static class NavigateView extends JComponent 
       implements ChangeListener, MouseInputListener
    {
    private JComponent targetComponent = null;
    private double scale;
    private Point anchorPoint;
    private JViewport viewport;
    private Point viewportAnchorPos; private Image bufferImage = null;
    private boolean needRepaintBuffer = false;  public NavigateView(JScrollPane scrollPane, JComponent component, double scale)
    {
    targetComponent = component;
    this.viewport = scrollPane.getViewport();
    this.scale = scale; this.viewport.addChangeListener(this);
    this.addMouseListener(this);
    this.addMouseMotionListener(this);
    setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
    } public Dimension getPreferredSize()
    {
    Dimension d = targetComponent.getPreferredSize();
    d.width *= scale;
    d.height *= scale; Insets insets = getInsets();
    d.width += insets.left + insets.right;
    d.height += insets.top + insets.bottom; return d;
    }

    protected void paintComponent(Graphics g)
    {
    if (bufferImage == null || needRepaintBuffer) {
    prepareBufferedImage();
    } Insets insets = getInsets();
    g.translate(insets.left, insets.top); Rectangle rect = targetComponent.getVisibleRect();
    rect.x *= scale;
    rect.y *= scale;
    rect.width *= scale;
    rect.height *= scale; g.drawImage(bufferImage, 0, 0, getWidth(), getHeight(), null, this);
    g.setColor(Color.red);
    g.drawRect(rect.x, rect.y, rect.width-1, rect.height-1); g.translate(-insets.left, -insets.top);
    }

    public void repaintBuffer()
    {
    needRepaintBuffer = true;
    } private void prepareBufferedImage()
    {
    if (bufferImage == null || 
    bufferImage.getWidth(this) < getWidth() ||
    bufferImage.getHeight(this) < getHeight()) {
    bufferImage = this.createImage(getWidth(), getHeight());
    }
    Graphics2D g2d = (Graphics2D) bufferImage.getGraphics();

    g2d.scale(scale, scale);
    targetComponent.paint(g2d);
    g2d.dispose(); needRepaintBuffer = false;
    } public void stateChanged(ChangeEvent e)
    {
    repaint();
    } public void mousePressed(MouseEvent e) 
    {
    Point p = e.getPoint();
    Rectangle rect = targetComponent.getVisibleRect(); if (rect.contains(p.x / scale, p.y / scale)) { 
    this.anchorPoint = p;
    this.viewportAnchorPos = viewport.getViewPosition();
    }
    else {
    int x = (int) (p.x / scale - rect.width / 2);
    int y = (int) (p.y / scale - rect.height / 2);
    setViewPositon(x, y); this.viewportAnchorPos = viewport.getViewPosition();
    rect = viewport.getViewRect();
    this.anchorPoint = new Point(
    (int)((rect.x + rect.width / 2) * scale),
    (int)((rect.y + rect.height/ 2) * scale));
    }
    } public void mouseDragged(MouseEvent e) 
    {
    Point p = e.getPoint();
    int dx = (int) ((p.x - anchorPoint.x) / scale);
    int dy = (int) ((p.y - anchorPoint.y) / scale); Point viewportPos = viewport.getViewPosition();
    viewportPos.x = viewportAnchorPos.x + dx;
    viewportPos.y = viewportAnchorPos.y + dy; setViewPositon(viewportPos.x, viewportPos.y);
    } private void setViewPositon(int x, int y)
    {
    Rectangle rect = viewport.getViewRect(); x = Math.max(x, 0);
    y = Math.max(y, 0);
    x = Math.min(x, targetComponent.getWidth() - rect.width);
    y = Math.min(y, targetComponent.getHeight() - rect.height); viewport.setViewPosition(new Point(x, y));
    } public void mouseClicked(MouseEvent e) {}
    public void mouseReleased(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    public void mouseMoved(MouseEvent e) {}
    }
    }
      

  2.   

    十分感谢gtlang78()!
    学习!