问题
I have a "button" which is just a GRect
from the ACM Graphics Library. It has an inherited method addMouseListener
which I have tried (and failed) using. I need to know the syntax so that when someone clicks on the "button" I can invoke another method which resides in the same class.
I want to know:
- Is it
ButtonName.addMouseListener
oraddMouseListener(ButtonName)
- Can I put the line mentioned above right after I create the button?
- What is the syntax that allows a click on the button to call something?
- Where is the syntax in question 3 supposed to go? Does it have its own class?
My truncated code:
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();
}
});
}
}
My full code:
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;
}
}
回答1:
According to the documentation of addMouseListener() you add an implementation of MouseListener
to a GObject
, GRect
in particular. Here is an example that adds an anonymous listener:
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
}
});
You can also use MouseAdapter
that already implements all methods of MouseListener
, ie:
rect.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
}
});
Or a non anonymous case:
class CustomListener extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}
CustomListener listener = new CustomListener();
rect.addMouseListener(listener);
Here is a simple demo program that changes GRect's color on click:
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());
}
});
}
}
回答2:
i think that you could use GMouseEvent for this task for more information you can check the next link:
http://www.matcmp.ncc.edu/~sherd/classdoc/cmp211/cs2Programs/doc/acm/graphics/GMouseEvent.html
来源:https://stackoverflow.com/questions/22264915/what-is-the-syntax-for-a-mouselistener-when-using-acm-graphics