Java:如何在GUI中等待1秒

Java:如何在GUI中等待1秒,java,swing,Java,Swing,我试图用Java制作一台卡拉OK机,但我不知道如何在GUI中延迟程序。我已经在这个网站上搜索了大量的主题,但是我仍然没有找到一个适合这个网站的解决方案 import javax.swing.*; import java.awt.event.*; public class KaraokeMachine extends JFrame implements ActionListener { ClassLoader Idr = this.getClass().getClassLoader();

我试图用Java制作一台卡拉OK机,但我不知道如何在GUI中延迟程序。我已经在这个网站上搜索了大量的主题,但是我仍然没有找到一个适合这个网站的解决方案

import javax.swing.*;
import java.awt.event.*;
public class KaraokeMachine extends JFrame implements ActionListener
{
    ClassLoader Idr = this.getClass().getClassLoader();
    JLabel lbl1 = new JLabel( "" );
    JLabel lbl2 = new JLabel( "" );
    JLabel lbl3 = new JLabel( "" );
    JLabel lbl4 = new JLabel( "" );
    JButton btn = new JButton( "Play" );
    int x = 0;
    int y = 0;
    int z = 0;
    JPanel pnl = new JPanel();

    public KaraokeMachine()
    {
        super( "Karaoke" );
        setSize( 520, 280 );
        setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        pnl.add( lbl1 );
        pnl.add( lbl2 );
        pnl.add( lbl3 );
        pnl.add( lbl4 );
        pnl.add( btn );
        btn.addActionListener( this );
        add( pnl ); setVisible( true );
    }

    public void actionPerformed( ActionEvent event )
    {
        if( event.getSource() == btn )
        {
            //
        }
    }
    public static void main( String[] args ) throws InterruptedException
    {
        KaraokeMachine karaoke = new KaraokeMachine();
    }
}

我想在1秒后更改标签文本。我已经尝试了<代码>线程。睡眠<代码>两者都在catch语句中,而没有在<>代码> /</代码>的地方,但是没有一个编译器会说它是一个错误,并且程序一次只延迟几秒钟,结果就显示在中间,但是中间没有结果。有人能告诉我怎样才能让
lbl1
说“一切”,然后一秒钟后说“一切都好”,然后再过一秒钟说“一切都好!”?谢谢。

您不应该在gui线程中调用
sleep()
方法,否则所有界面都将冻结。您应该使用单独的线程,并与gui线程通信,告诉他何时更新界面

在Swing应用程序中处理线程的最佳方法是使用
SwingWorker
对象。特别是,它提供了两个钩子方法,它们是
process
done
,直接在gui线程中调用,是发布工作线程完成的进度的强大方法。在您的情况下,您应该这样做:

SwingWorker<Void, String> worker = new SwingWorker<Void, String>(){

        @Override
        protected Void doInBackground() throws Exception {
            this.publish("Everything");
            Thread.sleep(1000);
            this.publish("Everything is");
            Thread.sleep(1000);
            this.publish("Everything is Awesome!");
            return null;
        }

        @Override
        protected void process(List<String> res){
            for(String text : res){
                 label.setText(text); 
            }
        }

    };

    worker.execute();
SwingWorker-worker=新的SwingWorker(){
@凌驾
受保护的Void doInBackground()引发异常{
这个。发布(“一切”);
睡眠(1000);
这个。发布(“一切都是”);
睡眠(1000);
发布(“一切都很棒!”);
返回null;
}
@凌驾
受保护的无效进程(列表资源){
for(字符串文本:res){
label.setText(文本);
}
}
};
worker.execute();

p.S.:您只能对辅助对象调用一次
execute()
方法。如果要多次调用它,必须实例化新对象。

可以使用
javax.swing.Timer
来实现。将代码中的
/
替换为:

        final AtomicInteger frame = new AtomicInteger(0);
        final String[] text = {
                "Everything",
                "Everything is",
                "Everything is Awesome!"
        };
        final Timer timer = new Timer(1000, null);
        timer.addActionListener((e) -> {
            lbl1.setText(text[frame.getAndIncrement()]);
            if (frame.get() >= text.length) {
                timer.stop();
            }
        });
        timer.start();

了解Java线程。你可以使用一个线程,然后在那里你可以休眠()或等待(),等待它发生。输出文本Everything is Awesome的代码片段在哪里?你能提供一个链接告诉我吗?我忽略了这一点,因为我尝试了许多不同的代码,它们都说“Everything is Awesome”,但没有一个有效。有人能告诉我一个吗?对不起,我很困惑。SwingWorker放在哪里?在调用worker.execute()之前,worker对象的实例化可以在任何地方进行;应该调用execute()方法,从何处开始执行任务。但是我应该把它放在代码中的何处?如果您想在按下按钮时调用它,可以将它放在
/
的位置。现在我收到编译器消息说,“public static void main(String[]args)”是表达式的非法开始。我该如何解决这个问题?