swing Ritarda un'attività UI per un periodo specifico


Esempio

Tutte le operazioni relative allo Swing avvengono su una filettatura dedicata (la EDT - E vent D ispatch T hread). Se questo thread viene bloccato, l'interfaccia utente diventa non reattiva.

Pertanto, se si desidera ritardare un'operazione, non è possibile utilizzare Thread.sleep . Utilizzare invece javax.swing.Timer . Ad esempio il seguente Timer invertirà il testo di su una JLabel

  int delay = 2000;//specify the delay for the timer
  Timer timer = new Timer( delay, e -> {
    //The following code will be executed once the delay is reached
    String revertedText = new StringBuilder( label.getText() ).reverse().toString();
    label.setText( revertedText );
  } );
  timer.setRepeats( false );//make sure the timer only runs once

Di seguito è riportato un esempio eseguibile completo che utilizza questo Timer : l'interfaccia utente contiene un pulsante e un'etichetta. Premendo il pulsante si invertirà il testo dell'etichetta dopo un ritardo di 2 secondi

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 );
      //Instead of directly updating the label, we use a timer
      //This allows to introduce a delay, while keeping the EDT free
      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 );//make sure the timer only runs once
      timer.start();
    } );

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