延遲特定時間段的 UI 任務
所有與 Swing 相關的操作都發生在專用執行緒上(EDT- E vent D ispatch T hread)。如果此執行緒被阻止,則 UI 變得無響應。
因此,如果你想延遲操作,則無法使用 Thread.sleep
。請改用 javax.swing.Timer
。例如,以下 Timer
將反轉 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
下面給出了一個使用此 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 );
//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 );
}
}