所有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 ); } }