0

Stanford CS106Aの Rubber Banding 問題を解決しようとしています。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

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 に答える
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 をクラス レベルで実装することもできます。それを実装する別の具象クラスを作成し、これの代わりにそのインスタンスをキャンバスに渡すこともできます。フィールド変数を、リスナーを実装する匿名クラスと等しくして、それを 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 に答える