求助:图片拖动放大的程序 如http://nationalgallery.org.uk/cgi-bin/WebObjects.dll/CollectionPublisher.woa/wa/loadApplet?workNumber=NG6588&collectionPublisherSection=work中的图片拖动缩放功能,请各位高手帮忙看看,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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()!学习! 一简单练习,发现几处不明白的地方,望说明一下,谢谢! 帮我看看我的“摇号”程序,有点问题…… LOG4J加载配置文件出错,请问何解?谢谢,在线等待 新手请问编译可以通过但是运行出错,是不是环境变量没设好? 如何读取文本域的内容到流? 概念问题,期待回音 初学java,java读写文件? 请问怎样把一个String[]的元素转换成 int型的变量 怎样格式化输出:即把7输出为007? 我发现一个问题(swing的).swing高手请进. 这异常是什么原因,引起,要如何解决, 我在做一个GUI查询的时候出现了这样的问题!
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) {}
}
}
学习!