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

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

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

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

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

任何人都有提示吗?

java user-interface
2个回答
0
投票
int delay = 5000; // delay in milliseconds 

ActionListener taskPerformer = new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { //...Perform a task... } }; 
    Timer timer = new Timer(delay, taskPerformer);
    timer.setRepeats(false); 
    timer.start(); // timer starts - after delay time your task gets executed

Source


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();
© www.soinside.com 2019 - 2024. All rights reserved.