gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:52:44 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com