MouseDragged работает ИЛИ MouseMoved работает, но не оба - PullRequest
0 голосов
/ 02 июля 2018

Я сейчас работаю над заданием. Я должен отобразить набор координат относительно мыши на кадре. Мне не разрешено использовать компоненты 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 Ответ

0 голосов
/ 02 июля 2018

Нет проблем с использованием mouseDragged и mouseMoved вместе. Они работают просто отлично. Проблема в том, что вы устанавливаете на theLabel.

Проблема: Проблема заключается в том, что когда вы устанавливаете местоположение theLabel в методе mouseMoved, theLabel находится прямо под указателем мыши. Таким образом, вы не можете создать жест healthy mouseDrag , который должен произойти с вашим displayWindow компонентом. Другими словами, ваш mouseDrag применяется к самому theLabel, а не к displayWindow, поскольку theLabel расположен под указателем мыши в верхней части displayWindow.

Как я узнал? Я просто использовал старый трюк! Я только что установил цвет фона на theLabel:

myLabel.setBackground(Color.lightGray);

Это помогло мне увидеть, где находится myLabel, поэтому проблема решена!

Решение: Решение состоит в том, чтобы установить местоположение для theLabel, которое не находится под указателем мыши. Это поможет запустить здоровую мышиную мышку с места мыши. Примерно так:

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

Надеюсь, это поможет!

...