Java:如何在GUI中等待1秒
我试图用Java制作一台卡拉OK机,但我不知道如何在GUI中延迟程序。我已经在这个网站上搜索了大量的主题,但是我仍然没有找到一个适合这个网站的解决方案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();
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)”是表达式的非法开始。我该如何解决这个问题?