【问题标题】:Swing Timer is only calling two of three methods when it firesSwing Timer 在触发时只调用三个方法中的两个
【发布时间】: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


【解决方案1】:

如果一切都如你所说,那么在我看来这是一个不可能的结果:

callback.result(finalNo, engine);
callback.playback();

您说callback.result() 被调用,其最后一个语句是System.out.println(),它在控制台上可见,但callback.playback(); 的第一个System.out.println() 语句在控制台上不可见。

要么您修改了代码但没有重新编译它,要么callback.playback() 的结果可见,但您需要滚动控制台窗口才能看到它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 2013-10-18
    相关资源
    最近更新 更多