- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个程序,可以通过单击和拖动在屏幕上移动图像。唯一的问题是,当我单击图像并开始在面板上拖动它时,图像首先跳转到鼠标光标的位置。如何防止这种情况发生,以便无论我单击图像的何处,图像都会简单地移动?我只能让鼠标光标在开始拖动时跳到鼠标箭头下方,或者在开始拖动时跳到鼠标箭头上方,或者设置到要拖动的图像的中间。
我正在使用以下函数将 Image 类的 Image 对象移动到另一个类中:
moveImage(selected,x,y);
其中 x 和 y 是 mouseDragged 方法中的坐标。这是我的图像类:
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
class Image {
private int x;
private int y;
private BufferedImage image;
private StringBuffer filepath;
private boolean isTurned;
public Image(int x, int y, String filepath) throws IOException {
this.filepath = new StringBuffer(filepath);
this.x = x;
this.y = y;
this.image = ImageIO.read(new File(String.valueOf(filepath)));
}
public void draw(Graphics g){
g.drawImage(image, x, y, null);
}
public void undraw (Graphics g, Color c ){
g.setColor(c);
g.fillRect(x,y, image.getWidth(), image.getHeight());
}
public boolean containsXY (int x, int y){
if ( (this.x <= x ) && (x <= (this.x+this.image.getWidth())) && (this.y <= y ) && (y <= (this.y+this.image.getHeight())) ){
return true;
}
return false;
}
public void move (Graphics g, int x, int y) {
System.out.println("int x = " + x + " int y = " + y);
System.out.println("this x = " + this.x + " this y = " + this.y);
System.out.println("width: " + this.image.getWidth() + " height: " + this.image.getHeight());
undraw(g, Color.WHITE);
/* this.x = x - ((x+image.getWidth())-x);
this.y = y -((y+image.getHeight())-y);
this.x = x - (x-this.x);
this.y = y - (y-this.y);
this.x = x - (this.x+image.getWidth()-x);
this.y = y - (this.y+image.getHeight()-y);
this.x = this.x + (x-image.getWidth());
this.y = this.y + (y-image.getHeight());
this.x = x - (image.getWidth());
this.y = y - (image.getHeight());*/
this.x = x - (image.getWidth()/2);
this.y = y - (image.getHeight()/2);
draw(g);
}
public void turn(Graphics g) throws IOException {
if (isTurned) {
filepath.replace(filepath.length()-9, filepath.length(), ".gif" );
undraw(g, Color.WHITE);
image = ImageIO.read(new File(String.valueOf(filepath)));
draw(g);
isTurned = false;
}
else {
filepath.replace(filepath.length()-4, filepath.length(), " back.gif" );
undraw(g, Color.WHITE);
image = ImageIO.read(new File(String.valueOf(filepath)));
draw(g);
isTurned = true;
}
}
}
正如您所看到的,在 move 方法中,我尝试了很多不同的方法来操作传入的鼠标事件拖动的坐标。现在在我正在使用的代码中
this.x = x - (image.getWidth()/2);
this.y = y - (image.getHeight()/2);
当我拖动鼠标光标时,它会使鼠标光标锁定在图像的中间,这是我目前能做的最好的事情。因此,当我想要移动图像并单击图像的一角时,它会“弹出”到图像的中间并锁定在那里,同时拖动图像。但我不想要这个。我希望鼠标光标停留在我开始拖动时单击的图像位置上,而不是在其他地方重新绘制图像,然后开始拖动。
这是我调用 Image 对象的类,我在这个类中调用它:s 方法 moveImage:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
class PaintSurface extends JLabel implements MouseListener, MouseMotionListener {
private int x, y;
private JButton browse;
private Collection<Image> images = new ArrayList<Image>();
private final JFileChooser fc = new JFileChooser();
private Image selected;
public PaintSurface(JButton b){
browse = b;
addMouseListener(this);
addMouseMotionListener(this);
browse.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int x = fc.showOpenDialog(browse);
if (x == JFileChooser.APPROVE_OPTION){
try {
buttonPressed(fc);
} catch (IOException e1) {
e1.printStackTrace();
}
}
else if (x ==JFileChooser.CANCEL_OPTION){
System.out.println("No file selected.");
}
}
});
}
public void paintComponent (Graphics g){
super.paintComponent(g);
for (Image i: images){
i.draw(g);
}
}
public void addImage(Image i){
images.add(i);
Graphics g = getGraphics();
i.draw(g);
}
public void buttonPressed(JFileChooser fc) throws IOException {
File selectedFile = fc.getSelectedFile();
String filepath = String.valueOf(selectedFile.getAbsolutePath());
Image i = new Image(x, y, filepath );
selected = i;
addImage(i);
repaint();
}
public Image findImage(int x, int y){
Image[] imageArray = images.toArray(new Image[images.size()]);
for (int i = imageArray.length - 1; i >= 0; i--){
if (imageArray[i].containsXY(x, y)){
return imageArray[i];
}
}
return null;
}
public void moveImage (Image i, int x, int y) { //
i.move(getGraphics(), x, y);
}
public boolean removeImage(Image i){
Graphics g = getGraphics();
i.undraw(g, Color.WHITE);
return images.remove(i);
}
@Override
public void mouseClicked(MouseEvent e) {
x = e.getX();
y = e.getY();
System.out.println("mouseclick");
selected = findImage(x,y);
if (selected != null) {
Graphics g = getGraphics();
try {
selected.turn(g);
repaint();
} catch (IOException e1) {
e1.printStackTrace();
}
selected = null;
}
}
@Override
public void mousePressed(MouseEvent e) {
Image i = findImage(e.getX(), e.getY());
if (i == null) {
System.out.println("null mousepress");
return;
}
else {
System.out.println("not null mousepress");
if (i == selected){
return;
}
else {
removeImage(i);
addImage(i);
selected = i;
}
}
}
@Override
public void mouseDragged(MouseEvent e) {
int x = e.getX();
int y = e.getY();
if (selected != null) {
moveImage(selected,x,y);
repaint();
}
}
@Override
public void mouseReleased(MouseEvent e) {
selected = null;
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseMoved(MouseEvent e) {
}
}
有这方面经验的人可以帮忙吗?大约一周以来我一直用这个拉扯我的头发......
最佳答案
您需要跟踪单击位置的变化,而不是移动到新的光标位置。在mousePressed
中,存储原始按下位置:
// lastX, lastY are object variables
lastX = e.getX();
lastY = e.getY();
在mouseDragged
中,计算增量
public void mouseDragged(MouseEvent e) {
int x = i.getX() + e.getX() - lastX;
int y = i.getY() + e.getY() - lastY;
if (selected != null) {
moveImage(selected,x,y);
repaint();
}
lastX = e.getX();
lastY = e.getY();
}
关于java - 使用 mouseDragged 时,如何让图像移动而不首先跳转到鼠标光标的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36450770/
@Override public Shape getShape() { final Rectangle2D.Double result = new Rectangle2D.Do
我们目前正在修复一个项目,该项目必须在下周完成,所以我们的时间已经不多了(别担心,我想说的是我们没有时间浪费时间)我们所有的代码并重新开始......)。 我们有一个 JPanel (="page")
我创建了一个 Java 应用程序来添加/删除并在 JPanel 上显示随机数量的点。每次拖放都可以移动点。为了撤消最后的操作,我缓冲了这些点。 我的问题:如果通过“mouseDragged”移动一个点
我如何知道从 mouseDragged 事件中按下的按钮? 我在 mouseDragged() 中遇到问题,因为接收到的 MouseEvent 为 getButton() 返回 0。我对鼠标位置没有问
拖动鼠标后释放鼠标时是否应该调用 mouseReleased() 事件? 我需要调用 mouseReleased() 来重置 mouseDragged() 中使用的一些变量,但它似乎从未被调用。 最佳
我正在构建一个文本编辑器,并尝试添加使用行号边距选择行的功能。我当前的方法是使用 mouseDragged 来更新所选行。当进行缓慢的鼠标移动时,这工作得很好,但是当进行更快的移动时,选择无法跟上并且
所以我使用 knob.js 创建两个表盘,一个在另一个里面。外表盘代表一本书的累积评分,即所有评分的平均值。这个外层表盘有 data-readOnly="true" 并且它的值在这些表盘的公共(pub
我正在尝试制作一个 SpriteKit 游戏,玩家可以在其中拖动 Sprite 组,但我不知道如何让 Sprite 跟随鼠标光标。使用 SpriteKit 样板,我得到了这个: 以下是我如何移动“He
我有 2 个 NSView 子类,它们是公共(public) super View 的 subview 。它们不重叠,并且都拦截鼠标拖动的调用。当我从一个子类拖动到另一个子类时,即使我在整个屏幕上拖动
我会直接提出问题。如何为我的应用程序实现一个系统,让我在按住鼠标左键的同时为下面显示的这些矩形着色?当释放时,它会停止着色。我在互联网上搜索,但我仍然无法理解这些 MouseEvents 是如何工作的
我有一个程序,可以通过单击和拖动在屏幕上移动图像。唯一的问题是,当我单击图像并开始在面板上拖动它时,图像首先跳转到鼠标光标的位置。如何防止这种情况发生,以便无论我单击图像的何处,图像都会简单地移动?我
谁能告诉我如何将位置 X 和 Y 返回到我的 WindowController NSTextField(testTextX 和 testTextY)? 我以编程方式创建了一个 windowContro
如何通过 mouseDragged 在 JPanel 上进行铅笔绘图? 我有一个 JPanel,我想在其中使用鼠标进行绘制,因此每当我在该 JPanel 上拖动鼠标时,都会为每个 (x,y) 绘制一个
完成创建自定义滚动条,问题是: addMouseMotionListener(new MouseMotionAdapter() { @Override public void mous
我已经编写了如下定义的 MouseListener,这样我就可以移动 JButton 来重新排序 JPanel 中的组件。 JPanel 位于 JScrollPane 中,因此当添加多个组件时,它们可
我正在尝试弄清楚如何在我的事件中访问使用 paintComponent 绘制的不同图像(在作业中不允许使用 JLabels)。 拖动时,我只想通过鼠标拖动移动一个图像,而且我似乎无法使用 e.getS
我目前正在将一个应用程序(或更准确地说,一个 VST 插件)从 Windows 移植到 OSX。我对 OSX 编程有点陌生,但我使用的是通过 HICocoaCreateView 添加到 Carbon
当我拖动鼠标时,绘制或设置 JPanel 大小时出现问题,我设置的单击位置和大小取决于拖动位置(X 和 Y)绘制可调整大小的矩形(JPanel)。 private void panelMouseDra
我正在尝试为 JTable 编写自定义的拖放行为,但无法接收 MOUSE_DRAGGED 事件。我想问题是 native DnD 操作消耗了事件(如 mouseDragged 的 javadoc 中所
我正在创建一个程序,您可以在其中在面板上绘制(线条、椭圆形或矩形)并指定颜色、宽度、填充等。我有一个实现 MouseMotionListener 和 MouseListener 的 JPanel 类。
我是一名优秀的程序员,十分优秀!