如何使这个mouselistener只关心一个对象?

时间:2010-02-28 03:17:50

标签: java

我正在研究这些关于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 */
}

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

除了你发布的内容之外,我还没有查看过来源。但是你需要修改gOval和gRect或超类以接受mouseListener,或者在你的监听器中做以下的事情。

在MouseClicked,MouseMoved等方法中。获取事件的重点,然后浏览对象并查询它们以查看该点是否存在其边界。

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

答案 2 :(得分:0)

您需要发布addMouseListeners的源代码。

如果你在这里看一下this post,你可能会听到一些关于听众如何工作的想法(如果你发布了addMouseListener来源,我们当然可以帮你解决你的具体问题!)