- 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/
我正在尝试为我的网站创建一个功能,允许用户使用 mousemove 和 touchmove 事件水平滚动 div 内容(类似于 Apple AppStore any app Screenshots s
我有固定的侧边栏导航栏,它在悬停时工作,但我想通过单击折叠按钮打开第一个菜单。类似于悬停在菜单 1 上的工作方式。我已经尝试了以下方法。 jsfiddle Demo $(document).on('c
Mouse.Synchronize() 在 .Net 中有什么作用? MSDN 说它“强制鼠标重新同步” 最佳答案 只是我的假设: Stylus 中存在类似的方法类别:Stylus.Synchroni
有没有什么办法可以同时使用鼠标, pygame.mouse.set_visible(False) 已激活。当前鼠标仅在尝试使用时返回右下坐标。需要在隐藏鼠标时能够获得正确的坐标。 在他们的 docum
我有一个缺少数据的数据库。我需要估算数据(我使用的是鼠标),然后根据原始列创建新列(使用估算数据)。我需要使用这些新列进行统计分析。 具体来说,我的参与者使用李克特 7 分量表填写了几份问卷。有些人没
我正在编写一个与电脑交互的机器人。简而言之,我所做的是: -截取屏幕截图- 在此屏幕截图上识别对象(使用 cv2 matchTemplate) -使用找到的位置进行一些鼠标操作(例如:将鼠标指针移动到
我的程序是一个文本游戏,它使用 WindowsForm 上的文本框模拟控制台输出。我试图实现的一个功能是通过单击一个按钮,它将以一定的速度输出到 TextBox,这是通过这种方法实现的 atm: pu
我遇到了一个问题。如果有任何帮助,我将不胜感激。 我正在尝试从玩家位置射击到鼠标点击位置。代码没有给我任何错误,根据我的逻辑,它应该可以工作,但它没有 它创建了项目符号对象,仅此而已。 //Bulle
给定一个带蓝牙的 Windows Mobile 6.1 智能手机,我想将它注册为鼠标。 基本上我现在做的: 使用 Guid {00001124-0000-1000-8000-00805f9b34fb}
我有一个关于在 JavaFX 中实现鼠标拖动事件的正确方法的问题。 我的 playGame() 方法当前使用 onMouseClicked,但这只是一个占位符 理想情况下,我希望“飞盘”沿着鼠标拖动的
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我目前正在使用 Windows 的 RawInput API 来访问键盘和鼠标输入。我有点困惑的一件事是,当我将鼠标注册为 RawInputDevice 时,我无法移动我的 Win32 窗口或使用那里
我想在我的网站浏览器窗口中 move 鼠标,如下所示:www.lmsify.com。我怎样才能做到这一点?(javascript、flash、activex) 问候,丽莎M 最佳答案 他们并没有真正
我想要一个动画。我是后端开发人员,但我必须使用 jquery 创建动画。 动画、背景和元素位置随鼠标移动而变化。 类似于http://www.kennedyandoswald.com/#!/premi
如何将鼠标“锁定”到某个 OpenGL 窗口。有点像在 Minecraft 中是如何完成的。GameDev 是一个更好的询问地点吗? 最佳答案 正如 Robert 在评论中所说,OpenGL 实际上并
我正在尝试实现一个颜色选择器,它从屏幕上各处的像素中获取颜色。为此,我计划使用全局鼠标 Hook 来监听 WM_MOUSEMOVE,以便在鼠标四处移动时更新颜色,并监听鼠标点击以确认 (WM_LBUT
如何使用 Java 和 JNA(Java native 访问)与 Windows API 交互?。我试图通过在鼠标输入流上排队鼠标事件来让鼠标做某事,并且代码有效,因为 SendInput(...)
我想用 C++ 脚本 move 鼠标光标。我在 Parallels 中的 Windows 7 中使用 Visual C++ 2010 Express,并创建了一个控制台应用程序。 我知道 SetCur
我有一些关于 WH_MOUSE 的问题。根据我的阅读,通过将钩子(Hook)放入 DLL 中,它会注入(inject)进程。这是否意味着捕获鼠标也适用于我的桌面、菜单启动等?那么应用程序的标题栏呢?我
如何为多只鼠标显示另一个光标? 我有两个 TMemos,两个可以输入各自 TMemo 的键盘,2 个鼠标,我需要 2 个光标。 如果假设的话,我已经可以检测出哪只鼠标是哪只了。我怎样才能让我自己的光标
我是一名优秀的程序员,十分优秀!