Java 复位不';t工作不正常(反问题),未命中时Duke miss图像显示不正确
我正在用“重置”按钮完成一项学校作业,几个小时内我都不知道如何重置计数器。我认为这与鼠标点击的代码中的某些内容有关,但我无法理解。对于duke miss问题,我无法显示它,因此当我错过duke时,图像不会显示Java 复位不';t工作不正常(反问题),未命中时Duke miss图像显示不正确,java,actionlistener,mouselistener,Java,Actionlistener,Mouselistener,我正在用“重置”按钮完成一项学校作业,几个小时内我都不知道如何重置计数器。我认为这与鼠标点击的代码中的某些内容有关,但我无法理解。对于duke miss问题,我无法显示它,因此当我错过duke时,图像不会显示 import java.awt.*; import java.awt.event.*; public class CatchDuke extends Frame implements ItemListener, ActionListener { static final int
import java.awt.*;
import java.awt.event.*;
public class CatchDuke extends Frame implements ItemListener, ActionListener {
static final int MAX_LEVEL = 5;
static final int INITIAL_LEVEL = 1;
int hits = 0;
int misses = 0;
// Labels and controls
Label hitLabel;
Label missLabel;
Button reset;
Choice levelChoice;
// the canvas
DukeCanvas canvas;
/**
* Constructor
*/
public CatchDuke() {
setTitle("Catch the Duke");
setLayout(new BorderLayout());
// create display and control
Panel topPanel = new Panel(new GridLayout(2, 1));
add(topPanel, BorderLayout.NORTH);
Panel labelPanel = new Panel(new FlowLayout(FlowLayout.LEFT));
topPanel.add(labelPanel);
Label label = new Label("Number of Hits:");
labelPanel.add(label);
hitLabel = new Label(" 0");
labelPanel.add(hitLabel);
label = new Label("Number of Misses:");
labelPanel.add(label);
missLabel = new Label(" 0");
labelPanel.add(missLabel);
Panel controlPanel = new Panel(new FlowLayout(FlowLayout.LEFT));
topPanel.add(controlPanel);
label = new Label("Select Level:");
controlPanel.add(label);
levelChoice = new Choice();
for(int i=1; i<=MAX_LEVEL; i++) {
levelChoice.add(i+" ");
}
levelChoice.select(INITIAL_LEVEL-1);
controlPanel.add(levelChoice);
levelChoice.addItemListener(this);
reset = new Button("Reset");
controlPanel.add(reset);
reset.addActionListener(this);
// create the canvas
canvas = new DukeCanvas();
add(canvas, BorderLayout.CENTER);
canvas.setLevel(levelChoice.getSelectedIndex());
} // end of constructor
/**
* Implementing ItemListener
*/
public void itemStateChanged(ItemEvent event) {
canvas.setLevel(levelChoice.getSelectedIndex());
}
@Override
public void actionPerformed(ActionEvent event) {
levelChoice.select(INITIAL_LEVEL-1);
canvas.setLevel(INITIAL_LEVEL-1);
hits = 0;
misses = 0;
hitLabel.setText(String.valueOf(hits));
missLabel.setText(String.valueOf(misses));
}
/**
* the DukeCanvas class
*/
class DukeCanvas extends Canvas implements MouseListener, MouseMotionListener {
// duke images
Image duke, dukeWave, dukeMiss;
// current position of duke
int dukeX, dukeY;
// size of duke
int dukeWidth, dukeHeight;
// number of hits and misses
int hits = 0;
int misses = 0;
boolean hit = false;
// level of difficulty
private int level = 0; // add private
public void setLevel(int level) {
this.level = level;
}
/**
* Constructor
*/
public DukeCanvas() {
setBackground(Color.white);
// load images
Toolkit toolkit = Toolkit.getDefaultToolkit();
duke = toolkit.getImage("duke.gif");
dukeWave = toolkit.getImage("dukeWave.gif");
dukeMiss = toolkit.getImage("dukeMiss.gif");
addMouseListener(this);
addMouseMotionListener(this);
} // end of constructor
/**
* painting the component
*/
public void paint(Graphics g) {
// get canvas width and height
int canvasWidth = getSize().width-2;
int canvasHeight = getSize().height-2;
// draw a border
g.drawRect(0, 0, getSize().width, getSize().height);
if(hit) {
// display hit image
g.drawImage(dukeWave, dukeX, dukeY, this);
}
// else if (width)
// {
// g.drawImage(dukeMiss, dukeX, dukeY, this);
// }
else
{
// get image width and height
dukeWidth = duke.getWidth(this);
dukeHeight = duke.getHeight(this);
// calculate the width and height of the display area
int dWidth = canvasWidth - dukeWidth;
int dHeight = canvasHeight - dukeHeight;
// generate a new position for the duke and draw it
dukeX = (int)(Math.random()*1000) % dWidth;
dukeY = (int)(Math.random()*1000) % dHeight;
g.drawImage(duke, dukeX, dukeY, this);
}
}
/**
* Implementing MouseListener
*/
public void mouseClicked(MouseEvent event) {
if(hit) { // No successive hits allowed
hit = true;
repaint();
return;
}
int x = event.getX();
int y = event.getY();
if((dukeX < x && x < dukeX+dukeWidth) &&
(dukeY < y && y < dukeY+dukeHeight)) {
hits++;
hitLabel.setText(String.valueOf(hits));
hit = true;
}
else {
misses++;
Toolkit.getDefaultToolkit().beep();
missLabel.setText(String.valueOf(misses));
hit = false;
}
repaint();
}
import java.awt.*;
导入java.awt.event.*;
公共类CatchDuke扩展框架实现ItemListener、ActionListener{
静态最终整数最大值=5;
静态最终int初始水平=1;
int hits=0;
int未命中=0;
//标签和控件
标签标签;
标签错误;
按钮复位;
选择层次选择;
//画布
杜克帆布;
/**
*建造师
*/
公共图书馆(){
setTitle(“抓住公爵”);
setLayout(新的BorderLayout());
//创建显示和控件
面板顶部面板=新面板(新网格布局(2,1));
添加(topPanel,BorderLayout.NORTH);
Panel labelPanel=新面板(新FlowLayout(FlowLayout.LEFT));
topPanel.add(标签面板);
标签=新标签(“点击次数:”);
添加(标签);
hitLabel=新标签(“0”);
labelPanel.add(hitLabel);
标签=新标签(“未命中次数:”);
添加(标签);
错误标签=新标签(“0”);
labelPanel.add(标签错误);
面板控制面板=新面板(新的FlowLayout(FlowLayout.LEFT));
topPanel.add(控制面板);
标签=新标签(“选择级别:”);
控制面板。添加(标签);
levelChoice=新选项();
对于(int i=1;我找到了重置计数器无法正常工作的原因。结果表明,我只需要在代码的一部分中使用hits=e.getmouseclick();和miss=e.getmouseclick()。