MouseDragged 作品或 mouseMoved 作品,但不是两者兼而有之

Posted

技术标签:

【中文标题】MouseDragged 作品或 mouseMoved 作品,但不是两者兼而有之【英文标题】:MouseDragged works OR mouseMoved works, but not both 【发布时间】:2018-12-10 07:34:05 【问题描述】:

我目前正在执行一项任务。我必须在框架上显示一组与鼠标相关的坐标。我不允许使用 Swing 组件。当使用鼠标而不点击时,文本应该是红色的。单击并拖动鼠标后,文本应为黑色。在这两种情况下,文本都应该跟随鼠标。我可以让文本改变颜色,我可以让它显示适当的信息。当我尝试在 MouseMoved 和 MousedDragged 中设置标签的位置时,当我拖动时它无法识别。如果我为标签取出一个或另一个设置位置,另一个就可以了。我究竟做错了什么?我正在研究一个跑步者课程,我会包括它。主类只是实例化我的跑步者类的一个对象。

import java.awt.Button;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.*;
import java.awt.Rectangle ; 
import java.awt.Label;
import java.awt.Color;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;


class Proj06Runner extends Frame


  //Proj06Runner Constructor
  public Proj06Runner() 

System.out.println("Proj06");
System.out.println("I certify that this program is my own work and is not the work of others. ");
System.out.println("I agree not to share my solution with others.");
System.out.println("Eric Jackson.");

GUI gui = new GUI();//instantiate a GUI
  
//End Proj06Runner Class
//________________________________________________________________________


class GUI extends Frame 

  public GUI()//constructor
  


Rectangle bounds = this.getBounds();

   //Create Frame 
    Frame displayWindow = new Frame("Eric Jackson");
//Set size of Frame
displayWindow.setSize(300,200);
displayWindow.setLayout(null); 
displayWindow.setLocation(30 + bounds.x, 30 + bounds.y);



//Create Top button
Button TopButton = new Button("This Button does nothing");
TopButton.setBounds(7+bounds.x,30+bounds.y,285,25);
displayWindow.add(TopButton);

//Create Left button
Button LeftButton = new Button("Button");
LeftButton.setBounds(7+bounds.x,54+bounds.y,50,122);
displayWindow.add(LeftButton);

//Create Textfield      
TextField myTextField=new TextField("This TextField does nothing");  
myTextField.setBounds(7+bounds.x,175+bounds.y,285,22);
displayWindow.add(myTextField);

//Create Label to display coord text
Label myLabel=new Label();
myLabel.setBounds(50,50,100,20);
myLabel.setForeground(Color.red);
myLabel.setText(" ");
displayWindow.add(myLabel);


displayWindow.addWindowListener( new WindowAdapter() 
@Override
public void windowClosing(WindowEvent e) 

  System.exit(0);

 );


displayWindow.addMouseMotionListener(new MyMouseMotionProcessor(myLabel));
displayWindow.addMouseListener(new MyMouseProcessor(myLabel));

displayWindow.setVisible(true);    
  
    
//End GUI Definition
    //=========================================================

//=========================================================
//This class recognizes mousePressed(). This method is
// used to determine the starting position of the mouse
// pointer.
class MyMouseProcessor extends MouseAdapter

Label theLabel;
int MouseX, MouseY;
//Constructor
MyMouseProcessor( Label inLabel)
 //save references to the input objects
 theLabel = inLabel;
 //end constructor

public void mousePressed(MouseEvent e)
//end mousePressed()
 //end MyMouseProcessor
     //=======================================================


 class MyMouseMotionProcessor extends MouseMotionAdapter

Label theLabel;
int MouseX, MouseY;

//Constructor
MyMouseMotionProcessor(Label inLabel)
 //save incoming object reference
 theLabel = inLabel;
// end constructor

public void mouseDragged(MouseEvent e)
System.out.println("Drag = " + e);
  MouseX= e.getX()-2;
  if (MouseX<0)
  
   MouseX=0; 
  
  MouseY= e.getY()-15;
  if (MouseY <0)
  
    MouseY=0;
  
 //move label to the new location

 theLabel.setLocation(MouseX,MouseY);

theLabel.setForeground(Color.black);
String coordtextClick = MouseX+" , " + MouseY;
 theLabel.setText(coordtextClick);

//end mouseDragged()

public void mouseMoved(MouseEvent e)
  System.out.println("Move = " + e);
  theLabel.setForeground(Color.red);
  MouseX= e.getX()-2;
  if (MouseX<0)
  
   MouseX=0; 
  
  MouseY= e.getY()-4;
  if (MouseY <0)
  
    MouseY=0;
  
  String coordtext = MouseX+" , " + MouseY;
 theLabel.setLocation(MouseX,MouseY);
 theLabel.setText(coordtext);

//



//end class MyMouseMotionProcessor

【问题讨论】:

【参考方案1】:

mouseDraggedmouseMoved 一起使用没有问题。他们工作得很好。问题在于您设置为theLabel 的位置。

问题: 问题是当您在mouseMoved 方法中设置theLabel 的位置时,theLabel 位于鼠标指针下方。因此,您无法创建应该在 displayWindow 组件上发生的 healthy mouseDrag 手势。换句话说,您的 mouseDrag 被应用于theLabel 本身而不是displayWindow,因为theLabel 位于displayWindow 顶部的鼠标指针下方。

我是怎么知道的?我只是用了一个老把戏!我刚刚将背景颜色设置为theLabel

myLabel.setBackground(Color.lightGray);

这帮助我查看了myLabel 的位置,从而解决了问题!

解决方案: 解决方案是为theLabel 设置一个位置,该位置不在鼠标指针下方。这将有助于从鼠标位置启动健康的 mouseDrag。像这样的:

public void mouseDragged(MouseEvent e) 
    System.out.println("Drag = " + e);
    MouseX = e.getX() + 5; // <- note here
    if (MouseX < 0) 
        MouseX = 0;
    
    MouseY = e.getY() - 15; // <- note here
    if (MouseY < 0) 
        MouseY = 0;
    
    // move label to the new location

    theLabel.setLocation(MouseX, MouseY);

    theLabel.setForeground(Color.black);
    String coordtextClick = MouseX + " , " + MouseY;
    theLabel.setText(coordtextClick);
// end mouseDragged()

public void mouseMoved(MouseEvent e) 
    System.out.println("Move = " + e);
    theLabel.setForeground(Color.red);
    MouseX = e.getX() + 5; // <- note here
    if (MouseX < 0) 
        MouseX = 0;
    
    MouseY = e.getY() - 15; // <- note here
    if (MouseY < 0) 
        MouseY = 0;
    
    String coordtext = MouseX + " , " + MouseY;
    theLabel.setLocation(MouseX, MouseY);
    theLabel.setText(coordtext);
//

希望这会有所帮助!

【讨论】:

我不敢相信这是这么小的东西。非常感谢你的帮助。将标签从光标上移开一点就可以了,现在它可以正常工作了。再次感谢,我早上再看一下原理。你是救生员。 很高兴有帮助,在 *** 中,当一个答案解决了您的问题时,您可以通过单击该答案左侧的绿色复选标记将其标记为您的问题的答案。

以上是关于MouseDragged 作品或 mouseMoved 作品,但不是两者兼而有之的主要内容,如果未能解决你的问题,请参考以下文章

Java AWT:如何知道在 mouseDragged 事件后释放了哪个鼠标按钮?

使用 Jquery 或 Javascript 触发 mousemove 事件

Qtablewidget 中单元格上的 MouseMove 事件以显示或打印消息

使用Jquery或Javascript触发mousemove事件

纯 Javascript 或 VueJS 事件的 Mousemove 和 Hover Jquery 效果

MouseEnter/MouseMove 面板,包括空格