swing 将UI任务延迟特定时间

示例

所有Swing相关的操作发生在一个专门的线程(在EDT - é通风口d ispatch牛逼hread)。如果该线程被阻止,则UI将变得无响应。

因此,如果要延迟操作,则不能使用Thread.sleep。请javax.swing.Timer改用。例如,以下Timer将颠倒JLabel

  int delay = 2000;//指定计时器的延迟
  Timer timer = new Timer( delay, e -> {
    //一旦达到延迟,将执行以下代码
    String revertedText = new StringBuilder( label.getText() ).reverse().toString();
    label.setText( revertedText );
  } );
  timer.setRepeats( false );//确保计时器只运行一次

Timer下面给出了一个使用它的完整的可运行示例:UI包含一个按钮和一个标签。按下按钮2秒钟后将反转标签文本

import javax.swing.*;
import java.awt.*;

public final class DelayedExecutionExample {

  public static void main( String[] args ) {
    EventQueue.invokeLater( () -> showUI() );
  }

  private static void showUI(){
    JFrame frame = new JFrame( "Delayed execution example" );

    JLabel label = new JLabel( "Hello world" );
    JButton button = new JButton( "Reverse text with delay" );
    button.addActionListener( event -> {
      button.setEnabled( false );
      //我们使用计时器来代替直接更新标签
      //这允许引入延迟,同时保持EDT自由
      int delay = 2000;
      Timer timer = new Timer( delay, e -> {
        String revertedText = new StringBuilder( label.getText() ).reverse().toString();
        label.setText( revertedText );
        button.setEnabled( true );
      } );
      timer.setRepeats( false );//确保计时器只运行一次
      timer.start();
    } );

    frame.add( label,BorderLayout.CENTER);
    frame.add( button,BorderLayout.SOUTH);
    frame.pack();
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setVisible( true );
  }
}