【问题标题】:How do I make this mouselistener only care about one object?如何让这个 mouselistener 只关心一个对象?
【发布时间】:2010-02-28 11:52:47
【问题描述】:

我正在编写这些关于 Java 的斯坦福在线课程,我们刚刚开始参加活动,但我很难理解它。我正在玩“Java 的艺术与科学”一书中的一个程序。如果您单击它们,该程序将在画布上移动一个矩形和椭圆形。

我修改了 run 方法以尝试让侦听器仅在矩形上工作,但我惊讶地发现,即使进行了更改,两个对象都在被侦听...为什么?

原运行方式:

public void run() {
    GRect rect = new GRect(100, 100, 150, 100);
    rect.setFilled(true);
    rect.setColor(Color.RED);
    add(rect);
    GOval oval = new GOval(300, 115, 100, 70);
    oval.setFilled(true);
    oval.setColor(Color.GREEN);
    add(oval);
    addMouseListeners();
}

我更改的程序(使用私有 createRectangle 方法中的 MouseListener):

import java.awt.*;
import java.awt.event.*;
import acm.graphics.*;
import acm.program.*;

/** This class displays a mouse-draggable rectangle and oval */

public class DragObjects extends GraphicsProgram {


    public void run() {
        createRectangle();
        createOval();

    }

    private void createOval(){

        GOval oval = new GOval(300, 115, 100, 70);
        oval.setFilled(true);
        oval.setColor(Color.GREEN);
        add(oval);

    }

    private void createRectangle(){

        GRect rect = new GRect(100, 100, 150, 100);
        rect.setFilled(true);
        rect.setColor(Color.RED);
        add(rect);
        addMouseListeners();
    }

/** Called on mouse press to record the coordinates of the click */
    public void mousePressed(MouseEvent e) {
        lastX = e.getX();
        lastY = e.getY();
        gobj = getElementAt(lastX, lastY);
    }

/** Called on mouse drag to reposition the object */
    public void mouseDragged(MouseEvent e) {
        if (gobj != null) {
            gobj.move(e.getX() - lastX, e.getY() - lastY);
            lastX = e.getX();
            lastY = e.getY();
        }
    }

/** Called on mouse click to move this object to the front */
    public void mouseClicked(MouseEvent e) {
        if (gobj != null) gobj.sendToFront();
    }

/* Instance variables */
private GObject gobj;   /* The object being dragged */
private double lastX;   /* The last mouse X position */
private double lastY;   /* The last mouse Y position */
}

【问题讨论】:

    标签: java


    【解决方案1】:

    如果您指出方法addMouseListeners() 在超类GraphicsProgram 中会很有帮助。它所做的是将侦听器添加到 canvas,而不仅仅是单个形状。从那里,您需要以某种方式确定鼠标点击是发生在矩形还是椭圆形中。

    或者可能有一种方法可以将侦听器添加到单个形状。检查GRectGOval 类的Javadoc。我假设它们也在 acm.* 包之一中,这意味着它们没有内置到 Java 语言中。 (这就是为什么我推荐使用像 Eclipse 这样可以自动导入每个类的 IDE,而不是导入整个包的原因。)

    发布您正在学习的在线课程的链接也可能会有所帮助。

    【讨论】:

      【解决方案2】:

      除了您发布的内容外,我没有查看其他来源。但是您需要修改 gOval 和 gRect 或超类以接受 mouseListener,或者在您的侦听器中执行以下操作。

      在 MouseClicked、MouseMoved 等方法中。获取事件点,然后遍历您的对象并查询它们以查看该点是否存在于它们的边界内。

      您需要一个对象列表来循环遍历,然后在此方法中调用类似 gRect.containsPoint(myPoint) 的方法来检查该点是否存在于形状中。您仍然会遇到形状重叠的问题,因此您需要一些 z 轴或深度的概念来确定哪个形状位于顶部。

      【讨论】:

      • 与其修改 GOval 和 GRect 类(这可能无论如何都不可能),如果它们没有内置的行为,我可能会创建具有添加行为的子类。检查这些类的 Javadoc,也许你想要的已经存在。
      【解决方案3】:

      您需要发布 addMouseListeners 的源代码。

      如果您在此处查看this post,您可能会对侦听器的工作方式有所了解(如果您发布 addMouseListener 源,我们当然可以帮助您解决具体问题!)

      【讨论】:

      • 不,他/她是指您在run() 末尾和createRectangle() 末尾调用addMouseListeners();。看起来该方法可能在多个组件上调用Component.addMouseListener()
      • 请仔细阅读这个问题......如果代码是它的第一个位(在运行方法中使用 addMouseListeners),第二个位是我将它更改为的,但两者似乎都可以出于某种原因,同样的事情。
      • addMouseListeners 不是 JDK 方法 - 它是您自己的。我可以看到您在哪里调用它,但是在不知道它实际上做了什么的情况下,不可能告诉您代码错误。奇怪的是 addMouseListeners 正在调用 addMouseListener 到两个组件,而不仅仅是其中一个。
      • 我不明白您为什么将我们指向事件包 javadocs?标准 Java API 中没有称为 addMouseListeners 的方法。鉴于其他人的 cmets,它位于您修改过的那个的父类上。在不知道该方法的作用的情况下,很难给您一个明确的答案。如果您希望人们查看该方法,您应该提供原始代码的链接或将其粘贴到您的问题中,以便我们查看。我找到了这个但不确定是不是:jtf.acm.org/javadoc/student/acm/program/GraphicsProgram.html
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多