Eric Jackson
Eric Jackson

Reputation: 33

MouseDragged works OR mouseMoved works, but not both

I am currently working on an assignment. I have to display a set of coordinates in relation to the mouse on the frame. I am not allowed to use Swing components. When the mouse is used without clicking, the text should be red. Once the mouse is clicked and dragged, the text should be black. In both cases, the text should follow the mouse. I can get the text to change color, I can get it to display the appropriate information. When I try to setlocation of the label in both the MouseMoved, and the MousedDragged,it won't recognize when I drag. If I take out one or the other setlocations for the label, the other works just fine. What am I doing wrong? I'm working on a runner class, I'll include it. The main class just instantiates an object of my runner class.

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

Upvotes: 3

Views: 646

Answers (1)

STaefi
STaefi

Reputation: 4377

There is not a problem with using mouseDragged and mouseMoved together. They are working just fine. The problem is with the location you are setting to the theLabel.

Problem: The problem is that when you are setting the location of theLabel in the mouseMoved method, theLabel is being located just under the mouse pointer. So you cannot create a healthy mouseDrag gesture which should happen on your displayWindow component. In other word your mouseDrag is being applied to the theLabel itself rather than displayWindow, since theLabel is located under the mouse pointer on top of the displayWindow.

How did I find out? I just used an old trick! I've just set a background color to theLabel:

myLabel.setBackground(Color.lightGray);

This helped me see where the myLabel is being located so the problem solved!

Solution: The solution is to set a location for theLabel which is not located just under the mouse pointer. This will help with starting a healthy mouseDrag from the mouse location. Something like this:

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);
}//

Hope this helps!

Upvotes: 1

Related Questions