---如http://nationalgallery.org.uk/cgi-bin/WebObjects.dll/CollectionPublisher.woa/wa/loadApplet?workNumber=NG6588&collectionPublisherSection=work中的图片拖动缩放功能,请各位高手帮忙看看,谢谢!--
感谢gtlang78()给出的代码,运行正常,但是小弟想把他做成applet,放到html页面里去。请各位再次帮忙,十分感谢!
gtlang78()的代码: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) {}
}
}
感谢gtlang78()给出的代码,运行正常,但是小弟想把他做成applet,放到html页面里去。请各位再次帮忙,十分感谢!
gtlang78()的代码: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) {}
}
}
import java.awt.Frame;
import java.awt.image.renderable.ParameterBlock;
import java.io.IOException;
import javax.media.jai.*;
import com.sun.media.jai.codec.FileSeekableStream;
import javax.media.jai.widget.ScrollingImagePanel;
/**
* This program decodes an image file of any JAI supported
* formats, such as GIF, JPEG, TIFF, BMP, PNM, PNG, into a
* RenderedImage, scales the image by 2X with bilinear
* interpolation, and then displays the result of the scale
* operation.
*/
public class JAISampleProgramScale{ /** The main method. */
public static void main(String[] args) {
/* Validate input. */
if (args.length != 1) {
System.out.println("Usage: java JAISampleProgram " +
"input_image_filename");
System.exit(-1);
} /*
* Create an input stream from the specified file name
* to be used with the file decoding operator.
*/
FileSeekableStream stream = null;
try {
stream = new FileSeekableStream(args[0]);
} catch (IOException e) {
e.printStackTrace();
System.exit(0);
} /* Create an operator to decode the image file. */
RenderedOp image = JAI.create("stream", stream);
/*
* Create a standard bilinear interpolation object to be
* used with the "scale" operator.
*/
Interpolation interp = Interpolation.getInstance(
Interpolation.INTERP_BILINEAR);
int value = 45;
float angle = (float)(value * (Math.PI/180.0F)); // Create a ParameterBlock and specify the source and
// parameters ParameterBlock pb = new ParameterBlock();
pb.addSource(image); // The source image
pb.add(1.2F); // The xScale
pb.add(1.2F); // The yScale
pb.add(0.0F); // The x translation
pb.add(0.0F); // The y translation
pb.add(new InterpolationNearest()); // The interpolation // Create the scale operation
RenderedOp im = JAI.create("scale", pb, null);
//-----------------------------------add the other operator sample code here-------------------------
/* Get the width and height of image2. */
int width = im.getWidth();
int height = im.getHeight(); /* Attach image2 to a scrolling panel to be displayed. */
ScrollingImagePanel panel = new ScrollingImagePanel(im, width, height); /* Create a frame to contain the panel. */
Frame window = new Frame("JAI Sample Program");
window.add(panel);
window.pack();
window.show();
}
}