需要一种在编程 GUI 更新之间暂停的好方法,以便用户可以看到下一步操作之前发生的情况

问题描述 投票:0回答:1

我一直在尝试编写一个简单的图形化 Yahtzee,一旦轮到计算机,用户可以在显示下一个骰子之前看到最多三个 CPU 骰子的每一个骰子滚动几秒钟。但我尝试过的一切 - 使用 ActionListener、Thread.sleep()、invokeAndWait、长 while 循环的 Swing 计时器 - 本质上会跳过前两个验证/重绘,因此用户永远不会看到前两个滚动。我读过你不应该在 EDT 内暂停,但我不知道如何避免这种情况,因为流程是: userScoreBtn 单击 -> GUI 更新 #1 [暂停] -> GUI 更新 #2 [暂停] -> GUI 更新 #3。

我正在使用 Java Swing JFrame。

// tried stuff like...
    Timer timer = new Timer(3000, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e {
        // roll code
    contentPane.validate();
    contentPane.repaint();
    }
});
timer.setRepeats(false);
timer.start();

// works once, but not 3X like I want`
java swing concurrency timer edt
1个回答
0
投票

您将需要使用一个变量来跟踪动画的状态。例如:

Timer timer = new Timer(1000, new ActionListener() {
    private int step;

    @Override
    public void actionPerformed(ActionEvent e) {
        // roll code
        switch (++step) {
            case 1:
                // Show first roll state

                break;
            case 2:
                // Show second roll state

                break;
            case 3:
                // Show third roll state

                ((Timer) e.getSource()).stop();
                break;
            default:
                break;
        }

        contentPane.validate();
        contentPane.repaint();
    }
});
timer.setRepeats(true);
timer.start();

(实际上没有必要调用

setRepeats(true)
,因为计时器默认会重复,但我添加它是为了强调计时器需要为动画的每一帧重复。)

不能使用循环来执行动画。 GUI 应用程序的执行由系统控制,而不是由程序员控制。

© www.soinside.com 2019 - 2024. All rights reserved.