java - 如何让这个鼠标监听器只关心一个对象?

标签 java

我正在研究这些关于 Java 的斯坦福在线类(class),我们刚刚跨入了 Activity ,但我很难理解它。我正在玩“Java 的艺术与科学”书中的一个程序。如果您单击矩形和椭圆形,该程序将在 Canvas 上移动它们。

我修改了 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();
}

我更改的程序(在私有(private) 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 */
}

最佳答案

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

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

发布您正在关注的在线类(class)的链接也可能会有所帮助。

关于java - 如何让这个鼠标监听器只关心一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2349931/

相关文章:

java - 将字符表编码为枚举有哪些错误?

javax.net.ssl.SSLPeerUnverifiedException : peer not authenticated in jdk7 but not in jdk8

java - 从 eclipse 部署 Tomcat webapp 时出错

java - 使用java从外部网络连接MySQL

JavaFX 在线程任务完成后显示对话

java - 找不到符号...为什么?

java - 单元测试处理数据库记录的函数

java - Blackberry:读取项目中打包的文本文件(更快)

java - 将模拟对象作为 JUnit 参数传递给带参数的测试方法

java.sql.SQLException : Field 'supplier_id' doesn't have a default value