我正在研究这些关于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 */
}
答案 0 :(得分:2)
如果您指出方法addMouseListeners()
位于超类GraphicsProgram
中,将会很有帮助。它的作用是将监听器添加到 canvas ,而不仅仅是单个形状。从那里,你需要以某种方式确定鼠标点击是在矩形还是椭圆形中出现。
或可能是一种将侦听器添加到单个形状的方法。检查Javadoc中的GRect
和GOval
类。我假设它们也在一个acm。*包中,这意味着它们不是内置于Java语言中的。 (这就是为什么我建议使用像Eclipse这样的IDE,它可以自动导入每个类,而不是导入整个包。)
发布您正在关注的在线课程的链接可能也会有所帮助。
答案 1 :(得分:1)
除了你发布的内容之外,我还没有查看过来源。但是你需要修改gOval和gRect或超类以接受mouseListener,或者在你的监听器中做以下的事情。
在MouseClicked,MouseMoved等方法中。获取事件的重点,然后浏览对象并查询它们以查看该点是否存在其边界。
您需要循环访问的对象列表,然后在此方法中调用类似gRect.containsPoint(myPoint)的内容,检查该点是否存在于形状中。您仍然会遇到形状重叠的问题,因此您需要一些z轴或深度的概念来确定哪个形状位于顶部。
答案 2 :(得分:0)
您需要发布addMouseListeners的源代码。
如果你在这里看一下this post,你可能会听到一些关于听众如何工作的想法(如果你发布了addMouseListener来源,我们当然可以帮你解决你的具体问题!)