gpt4 book ai didi

java - 如何在 Java Swing 中使用鼠标平移图像

转载 作者:搜寻专家 更新时间:2023-10-31 08:17:31 29 4
gpt4 key购买 nike

我正在创建一个 Java 应用程序,它允许用户查看图像并使用鼠标平移图像。为了实现图像的平移,我结合使用了使用 JViewports 的 mouseClickedmouseDragged 事件。大部分代码在 mouseDragged 方法中

public void mouseDragged(MouseEvent e, WindowWrapper w) {
final JViewport vp = someFieldViewPort;

//Getting the point that the mouse is dragged to to
Point cp = e.getPoint();
final Point vPoint = vp.getViewPosition();

//I found the image went off the content to show the white border so I included this
// Here pp is a field that I sent when the mouse is clicked in a separate method

if(vPoint.getX()+pp.x-cp.x>=0 & vPoint.getY()+pp.y-cp.y>=0)
vPoint.translate(pp.x-cp.x, pp.y-cp.y);
else if(vPoint.getX()+pp.x-cp.x>=0 & vPoint.getY()+pp.y-cp.y<0)
vPoint.translate(pp.x-cp.x, (int) -vPoint.getY());
else if(vPoint.getX()+pp.x-cp.x<0 & vPoint.getY()+pp.y-cp.y>=0)
vPoint.translate((int) -vPoint.getX(), pp.y-cp.y);

//finally set the position of the viewport
vp.setViewPosition(vPoint);
vp.repaint();
}

虽然这很有效,但我觉得必须有一种更简单的方法来完成所有这些工作。如果不是全部,是否可以替换防止视口(viewport)离开图像到周围边框的代码?

最佳答案

尝试使用 scrollRectToVisible(...) 方法代替 JViewport#setViewPosition(...):

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
public class HandScrollDemo {
static class HandScrollListener extends MouseAdapter {
private final Point pp = new Point();
@Override public void mouseDragged(MouseEvent e) {
JViewport vport = (JViewport)e.getSource();
JComponent label = (JComponent)vport.getView();
Point cp = e.getPoint();
Point vp = vport.getViewPosition();
vp.translate(pp.x-cp.x, pp.y-cp.y);
label.scrollRectToVisible(new Rectangle(vp, vport.getSize()));
//vport.setViewPosition(vp);
pp.setLocation(cp);
}
@Override public void mousePressed(MouseEvent e) {
pp.setLocation(e.getPoint());
}
}
public JComponent makeUI() {
JLabel label = new JLabel(new Icon() {
TexturePaint TEXTURE = makeCheckerTexture();
@Override public void paintIcon(Component c, Graphics g, int x, int y) {
Graphics2D g2 = (Graphics2D)g.create();
g2.setPaint(TEXTURE);
g2.fillRect(x,y,c.getWidth(),c.getHeight());
g2.dispose();
}
@Override public int getIconWidth() { return 2000; }
@Override public int getIconHeight() { return 2000; }
});
label.setBorder(BorderFactory.createLineBorder(Color.RED, 20));
JScrollPane scroll = new JScrollPane(label);
JViewport vport = scroll.getViewport();
MouseAdapter ma = new HandScrollListener();
vport.addMouseMotionListener(ma);
vport.addMouseListener(ma);
return scroll;
}
private static TexturePaint makeCheckerTexture() {
int cs = 20;
int sz = cs*cs;
BufferedImage img = new BufferedImage(sz,sz,BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = img.createGraphics();
g2.setPaint(Color.GRAY);
for(int i=0; i*cs<sz; i++) { for(int j=0; j*cs<sz; j++) {
if((i+j)%2==0) { g2.fillRect(i*cs, j*cs, cs, cs); }
}}
g2.dispose();
return new TexturePaint(img, new Rectangle(0,0,sz,sz));
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() { createAndShowGUI(); }
});
}
public static void createAndShowGUI() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new HandScrollDemo().makeUI());
f.setSize(320, 320);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}

关于java - 如何在 Java Swing 中使用鼠标平移图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13341857/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com