我的图形用户界面有一个奇怪的行为。
首先,这里有一段代码:

/**
 *
 */
@Override
protected Void doInBackground() throws Exception {
    final ModelGameState actualGameState = controller.getActualGameState();
    final ModelCoinState actualCoinState = (actualGameState.getPlayersTurn() == ModelConstants.PLAYER_ONE_ID? actualGameState.getCoinsPlayerOne() : actualGameState.getCoinsPlayerTwo());
    final List<ModelCoinState> temp = MoveCalculator.getMoves(actualCoinState, this.cellID);
    final CountDownLatch lock = new CountDownLatch(temp.size());
    int time = 500;

    for(int i = 0; i < temp.size(); i++) {
        final int index = i;

        Timer timer = new Timer(time, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(actualGameState.getPlayersTurn() == ModelConstants.PLAYER_ONE_ID) {
                    actualGameState.setCoinsPlayerOne(temp.get(index));
                } else {
                    actualGameState.setCoinsPlayerTwo(temp.get(index));
                }

                controller.setActualGameState(new ModelGameState(actualGameState));

                lock.countDown();
            }
        });

        timer.setRepeats(false);
        timer.start();

        time += 500;
    }

    lock.await();

    return null;
}


在第二个这里我的GUI:



这是我的问题:每次lock.await被称为我的屏幕
看起来像这样:



如您所见,在我的每个圈子后面,左上角
每次调用lock.await()时都会显示我的GUI的图形(至少我
认为是在调用lock.await()的时候,因为当我删除lock.await()时
我看不到我的GUI的整个动画,但我也看不到
看到这种奇怪的行为,并且该行为总是出现
当程序通过doInBackground()的所有代码执行时。

是什么导致这种奇怪的行为?

最佳答案

没有答案,只是不同意,我反对,没有评论,没有尝试过您的代码,对不起我,这是有原因的,也许是我的错


doInBackground()是AWT / Swing EDT与工作线程之间的桥梁,默认情况下从不通知EDT
处理,发布,setProgress和done()通知EDT
那么doInBackground()中的Swing Timer违反了所有意图,为什么在官方API中实现了SwingWorker,却可以执行长时间运行的硬或非安全代码
再次将SwingWorker指定为AWT / Swing与Workers线程之间的桥梁

_____________________________


有两种方法


将CountDownLatch与invokeLater()或Swing Timer一起使用。不要混在一起,也不要从SwingWorker
使用CountDownLatch,util.Timer,SheduledExecutor,并通过包装通知EDT(仅相关,仅输出,方法将在屏幕上重新绘制)将方法摆动到invokeLater()
仅使用Swing计时器(非精确时间段)

10-07 19:48
查看更多