【发布时间】:2014-05-09 12:31:00
【问题描述】:
我正在编写一个简单的轮盘游戏,用户可以在其中添加玩家、下注和旋转轮盘(表示为 JLabel,它会更新其文本以显示轮盘号码)
public void spin(int wheelSize, int initialDelay, int finalDelay,
int delayIncrement, WheelCallback callback) {
Random rand = new Random();
int curNo = rand.nextInt(wheelSize) + 1;
int finalNo = 0;
int count = 10;
assert (curNo >= 1);
Listener myListener = new Listener(callback, this, curNo);
myListener.start(finalDelay);
班级Listener:
package model;
import java.awt.event.*;
import javax.swing.*;
import model.interfaces.*;
import model.GameEngineImpl;
import model.WheelCallbackImpl;
public class Listener implements ActionListener {
WheelCallbackImpl callback;
GameEngineImpl engine;
Timer timer;
int delay, curNo, finalNo;
int count = 10;
public Listener(WheelCallbackImpl wheelcall, GameEngineImpl newEngine, int number) {
callback = wheelcall;
engine = newEngine;
curNo = number;
}
public void actionPerformed(ActionEvent e) {
if (count == 0) {
engine.calculateResult(finalNo);
callback.result(finalNo, engine);
callback.playback();
timer.stop();
} else {
callback.nextNumber(curNo, engine);
curNo++;
finalNo = curNo;
count--;
}
}
public void start(int delay) {
timer = new Timer(delay, this);
timer.start();
}
}
Listener 与辅助类 WheelCallbackImpl 通信,后者处理用户反馈并与我的视图通信:
public class WheelCallbackImpl implements WheelCallback {
Wheel wcWheel = Wheel.myWheel;
public void nextNumber(int nextNumber, GameEngine engine) {
String strNo = Integer.toString(nextNumber);
assert (nextNumber >= 1);
System.out.println(nextNumber);
wcWheel.setCounter(strNo);
}
public void result(int result, GameEngine engine) {
System.out.println("callback.Result is running!");
Collection<Player> players = engine.getAllPlayers();
Player[] playerList = players.toArray(new Player[0]);
System.out.println("Player list length is " + playerList.length);
for (int i=0; i < playerList.length; i++) {
if (playerList[i].getNumberPick() == result)
wcWheel.storeResults(playerList[i].getPlayerName(), playerList[i].getPoints(), " won!", i);
else
wcWheel.storeResults(playerList[i].getPlayerName(), playerList[i].getPoints(), " lost!", i);
}
System.out.println("callback.result finished!");
}
/*
Called by the controller - calls the GUI display/replay prompts
*/
public void playback() {
System.out.println("Playback called!");
int n = 0;
while (n == 0)
wcWheel.playAgain();
}
}
我的 Timer 能够成功更新我的 JLabel,但是当它执行 if (count == 0) 块时,它似乎只调用了前 两个 方法,给我留下了以下输出:
6
7
8
9
10
11
12
13
14
15
Calculate result called!
callback.Result is running!
Player list length is 1
callback.result finished!
知道这里发生了什么吗?
【问题讨论】:
-
为了尽快获得更好的帮助,请发布MCVE(最小完整且可验证的示例)。
标签: java swing user-interface awt