我有一个“按钮”,它只是ACM Graphics Library中的GRect。它有一个继承的方法addMouseListener,我尝试过(但失败了)。我需要知道语法,以便当有人单击“按钮”时可以调用驻留在同一类中的另一种方法。

我想知道:


ButtonName.addMouseListener还是addMouseListener(ButtonName)
创建按钮后,可以立即在上面提到的行吗?
允许单击按钮调用某些内容的语法是什么?
问题3的语法应该去哪里?它有自己的课程吗?


我的截断代码:

import acm.graphics.*;
import acm.program.*;
import acm.util.*;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class Shooter extends GraphicsProgram

{
…
public GRect newShotB;
…
public void run()
    {
        test = new GLabel("start",printx+75,100);
        add(test);
        setup();
        test.setLabel("runing");
        fire();
        test.setLabel("Waiting");
        newShotB.addMouseListener(new MouseAdapter()
        {
                @Override
                public void mouseClicked(MouseEvent arg0) {
                    test.setLabel("clicked");
                    fire();
                }
            });
    }
}


我的完整代码:

import acm.graphics.*;
import acm.program.*;
import acm.util.*;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/**
 * Write a description of class Shooter here.
 *
 * @author (your name)
 * @version (a version number or a date)
 */
public class Shooter extends GraphicsProgram
{
    // instance variables - replace the example below with your own
    private static final int width = 400;       // Width of Canvas
    private static final int height = 600;      // Height of canvas
    private static final int BALL_Radius = 30;  // radius of the Ball
    public int startxpos = 10;                  // starting xpos
    public int startypos =  400;                // starting ypos
    public double xpos = startxpos;             // x position of gp
    public double ypos = startypos;             // y postion of gp
    public double t;                            // Time (for equations)
    public int score;                           // Score Aquired
    public int force;                           // Magnitude of Velocity
    public double angleR;                       // Angle in Radianss
    public double angleD;                       // Angle in Degrees
    public GLabel anglePrint;                   // Print out of angle
    public GLabel xposPrint;                    // Print out of x pos
    public GLabel yposPrint;                    // Print out of y pos
    public GLabel scorePrint;                   // Print out of score
    public GLabel timePrint;                    // Print out of t
    public GLabel nSBPrint;
    public GLabel test;
    public GOval gp;                            // The game Piece
    public GLine ground;                        // The Line that is the ground
    public GRect newShotB;                      // New Shot Button
    public GRect trusShotB;                     // New TrusShot Button

    public int printx = 25;                     // X Position of Glabels
    public int printy = 25;                     // Y position of Glabels


    /*
    public static void main(String[] ags)
    {
        String[] sizeArgs = { "width=" + WIDTH, "height= " +HEIGHT};
        new Shooter().start(sizeArgs);
    }
    */
    /**
     * Constructor for objects of class Shooter
     */
    public Shooter()
    {
    }
    public void run()
    {
        test = new GLabel("start",printx+75,100);
        add(test);
        setup();
        test.setLabel("runing");
        fire();
        test.setLabel("Waiting");
        newShotB.addMouseListener(new MouseAdapter()
        {
                @Override
                public void mouseClicked(MouseEvent arg0) {
                    test.setLabel("clicked");
                    fire();
                }
            });
    }

    public void setup()
    {
        timePrint = new GLabel ("Time:  "+String.valueOf(t),printx, printy);
        add(timePrint);

        anglePrint = new GLabel("Angle: "+String.valueOf(angleD), printx, printy+10);
        add(anglePrint);

        xposPrint = new GLabel ("x-pos: "+String.valueOf(xpos), printx, printy+20);
        add(xposPrint);

        yposPrint = new GLabel ("y-pos: "+String.valueOf(ypos), printx, printy+30);
        add(yposPrint);

        scorePrint = new GLabel("Score: "+String.valueOf(score), printx, printy+40);
        add(scorePrint);

        ground = new GLine(10,startypos + BALL_Radius, 300, startypos + BALL_Radius);
        add(ground);

        GRect newShotB = new GRect (printx, 100, 50, 20);
        newShotB.setFilled(true);
        newShotB.setColor(Color.green);
        add(newShotB);

        nSBPrint = new GLabel ("New Shot",printx ,100);
        add(nSBPrint);

        gp = new GOval(startxpos,startypos,BALL_Radius, BALL_Radius);
        gp.setFilled(true);
        gp.setVisible(true);
        gp.setColor(Color.blue);
        add(gp);

        //trusShotB = new GRect (printx, 150, 50, 20);
        //trusShotB.setFilled(true);
        //trusShotB.setColor(Color.green);
        //add(trusShotB);



        test.setLabel("endStart");

    }
        public void setpar()
    {


    }

    public void fire()
    {
        test.setLabel("Firing");
        ypos = startypos;
        xpos = startxpos;
        double vx;// = 10;
        double vy;// = 50;
        angleD = 45;
        force =50;

        angleR = Math.toRadians(angleD);
        vx = (Math.cos(angleR)*force);
        vy = (Math.sin(angleR)*force);
        t = 0;
        while (ypos<=startypos)
        {
            xpos=startxpos+vx*t;
            ypos=startypos-(vy*t+.5*(-9.8)*t*t);
            gp.setLocation(xpos,ypos);
            waitTime();
            timePrint.setLabel(String.valueOf(t));
        }
        test.setLabel("fired");
        gp.setVisible(false);

    }
    public void trusShot()
    {
        int sl= 20; //sidelength of the Truss
        int h = 100;// hight of truss
        int d = 200; //distance of truss from edgee
        GRoundRect t = new GRoundRect(sl, sl, h, d);
        t.setColor(Color.gray);

    }
    public void waitTime()
    {
        int waitTime = 100;
        try
        {
            Thread.sleep(waitTime);
        }
        catch(Exception e)
        {
            //ignoring
        }
        t = t+(waitTime/1000.0);
    }
    public void changeColor()
    {
        if(gp.getColor() == Color.red){
            gp.setColor(Color.blue);}
        else if (gp.getColor() == Color.blue)
        {
            gp.setColor(Color.red);
        }
    }
    public void raiseAngle()
    {
        angleD = angleD +1;
    }
    public void lowerAngle()
    {
        angleD = angleD -1;
    }
}

最佳答案

根据addMouseListener()的文档,您将MouseListener的实现添加到GObject,尤其是GRect。这是添加匿名侦听器的示例:

rect.addMouseListener(new MouseListener() {
    @Override
    public void mouseClicked(MouseEvent arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void mouseEntered(MouseEvent arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void mouseExited(MouseEvent arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void mousePressed(MouseEvent arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub
    }
});


您还可以使用已经实现MouseAdapter所有方法的MouseListener,即:

rect.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent arg0) {
        // TODO Auto-generated method stub
    }
});


或非匿名案例:

class CustomListener extends MouseAdapter {
    @Override
    public void mouseClicked(MouseEvent arg0) {
        // TODO Auto-generated method stub
    }
}

CustomListener listener = new CustomListener();
rect.addMouseListener(listener);


这是一个简单的演示程序,可在单击时更改GRect的颜色:

import acm.program.*;
import acm.util.RandomGenerator;
import acm.graphics.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class TestRect extends GraphicsProgram {
    private static RandomGenerator rand = new RandomGenerator();

    public void run() {
        final GRect rect = new GRect(10, 10, 100, 100);
        rect.setFilled(true);
        rect.setColor(Color.RED);
        add(rect);

        rect.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
                rect.setColor(rand.nextColor());
            }
        });
    }
}

10-02 22:05