在没有Thread.sleep()的情况下延迟涉及GUI的java程序

时间:2017-12-21 18:34:44

标签: java user-interface

我目前在java swing中编写迷你游戏。我已经设置了GUI,游戏涉及一系列数字在屏幕上闪烁然后消失 - 用户必须按照它们出现的顺序再次输入数字。

当数字最初显示时,我希望它们显示1-2秒,然后消失,并有另一个数字1-2秒等。

但是,我在显示数字的同时延迟了程序的问题。我不能使用Thread.sleep,因为它会隐藏整个程序,隐藏以前的数字等等。它只是不起作用。我已经尝试过我遇到的所有其他建议,其中没有一个已经有效。

任何人都有提示吗?

2 个答案:

答案 0 :(得分:0)

您可以使用Thread.sleep()

您遇到的问题可能是因为您正在尝试从Swing的事件调度线程更新UI。这是一个为Swing组件保留的线程,除了对UI的快速更新外,你应该不做任何事情。

public void prog() {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            label.setText("1");
        }
    }

    try {
        Thread.sleep(5000);
    } catch(Exception e) { }

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            label.setText("2");
        }
    }
}

public static void main(String[] args) {
    label = new JLabel("0");

    prog();
}

JLabel label

UI应该保持响应,因为它的组件交互应该在ActionListener中实现。但是如果你想在等待时执行其他工作,或者如果该功能包含在ActionListener的actionPerfomed()方法中,则可以启动新线程以休眠5秒然后更新UI。您还可以执行一些计算,这些计算需要5秒才能计算而不是在不阻塞UI的情况下进行休眠。代码是:

(new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Thread.sleep(5000);
        } catch (Exception e) { }

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                label.setText("2");
            }
        }
    }
}).start();

答案 1 :(得分:0)

choice

Source