0

我正在尝试解决斯坦福 CS106A的橡皮筋问题。根据addMouseListener() 上的 Java Doc,需要一个侦听器才能使用它。根据这个问题的解决方案,没有使用监听器,但是当我在没有任何监听器的情况下使用它时,我收到以下错误:

Component 类型中的方法 addMouseListener(MouseListener) 不适用于 arguments()

如何创建一个侦听器以使其侦听整个画布?

/**
 * This program allows users to create lines on the graphics canvas by clicking 
 * and dragging the mouse. The line is redrawn from the original point to the new
 * end point, which makes it look as if it is connected with a rubber band.
 */

package Section_3;

import java.awt.Color;
import java.awt.event.MouseEvent;

import acm.graphics.GLine;
import acm.program.GraphicsProgram;

public class RubberBanding extends GraphicsProgram{

private static final long serialVersionUID = 406328537784842360L;

public static final int x = 20;
public static final int y = 30;
public static final int width = 100;
public static final int height = 100;
public static final Color color = Color.RED;
public void run(){
    addMouseListener();
}

/** Called on mouse press to create a new line */
public void mousePressed(MouseEvent e) {
    double x = e.getX();
    double y = e.getY();
    line = new GLine(x, y, x, y);
    add(line);
}
/** Called on mouse drag to reset the endpoint */
    public void mouseDragged(MouseEvent e) {
    double x = e.getX();
    double y = e.getY();
    line.setEndPoint(x, y);
}
/* Private instance variables */
private GLine line;

}
4

3 回答 3

1

我试图将 addMouseListeners() 添加到 run() 方法,这就是问题所在。我上面添加 GCanvas 并收听它的解决方案也可以,但不需要。addMouseListeners() 应该使用 init() 而不是在 run() 中初始化。我之前无法使用 init(),因为我正在从 Stanfrod CS106A学习 Java,它使用了自定义的 Karel.jar 库参考。该库已将 init() 方法设为最终方法,因此我无法在任何程序中引用它。在我删除 Karel.jar 库并使用 jtf 中的 acm.jar 之后,我能够使用 init() 并且还能够将 addMouseListeners() 直接用于画布,而无需在已绘制的画布上添加任何其他画布。 所以整个问题是 Karel.jar !

于 2013-05-04T10:59:41.040 回答
0
public class RubberBanding extends GraphicsProgram implements MouseListener {
    public void run() {
        GCanvas c = getGCanvas();
        c.addMouseListener(this); 
    }

    @Override 
    public void mousePressed(MouseEvent e) {}

    @Override
    public void mouseDragged(MouseEvent e) {}

}

您可以像我在上面所做的那样在类级别实现 MouseListener。您还可以创建一个单独的具体类来实现它,并将它的实例传递给画布而不是 this。您甚至可以使字段变量等于实现侦听器的匿名类并将其传递给 Canvas 对象。

MouseListener listener = new MouseListener() {
    @Override 
    public void mousePressed(MouseEvent e) {}

    @Override
    public void mouseDragged(MouseEvent e) {}
}

class MyMouseListener implements MouseListener {
    @Override 
    public void mousePressed(MouseEvent e) {}

    @Override
    public void mouseDragged(MouseEvent e) {}
}

public void run() {
    GCanvas c = getGCanvas();
    c.addMouseListener(listener); 

    // OR

    GCanvas c = getGCanvas();
    c.addMouseListener(new MyMouseListener()); 

}
于 2014-03-20T17:02:21.620 回答
0

解决方案是添加一个 GCanvas 对象并在该对象上使用 addMouseListener()。

        GCanvas c = getGCanvas();   //Creates a GCanvas component so that addMouseListener could be applied to it.
        c.addMouseListener(this);   //Tracks mouse event for the canvas

然后我可以通过实现 @madprogrammer 所告诉的 MouseInputListener 来跟踪画布的鼠标事件。

于 2013-04-17T06:35:45.313 回答