如何在Java Swing应用程序中添加简单的延迟?

我想知道如何在Java中的Swing应用程序中添加时间延迟,我使用了Thread.sleep(time) ,并且我也使用了SwingWorker但它不起作用。 这是我的代码的一部分:

 switch (state) { case 'A': if (charAux == 'A') { state = 'B'; //Here's where I'd like to add a time delay jLabel13.setForeground(Color.red); break; } else { //Here's where I'd like to add a time delay jLabel12.setForeground(Color.red); break; } } 

我希望你在使用SwingWorker时可以帮助我或解决我的疑虑。

这是使用javax.swing.Timer的示例

 public class TestBlinkingText { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { } catch (InstantiationException ex) { } catch (IllegalAccessException ex) { } catch (UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new BlinkPane()); frame.setSize(200, 200); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } protected static class BlinkPane extends JLabel { private JLabel label; private boolean state; public BlinkPane() { label = new JLabel("Look at me!"); setLayout(new GridBagLayout()); add(label); Timer timer = new Timer(500, new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { state = !state; if (state) { label.setForeground(Color.RED); } else { label.setForeground(Color.BLACK); } repaint(); } }); timer.setRepeats(true); timer.setCoalesce(true); timer.setInitialDelay(0); timer.start(); } } } 

你删除了Thread.sleep是好事,因为这会让你的UI在2秒内没有响应。

你可以做的是启动一个只运行一次的Timer

 int delay = 2000; Timer timer = new Timer( delay, new ActionListener(){ @Override public void actionPerformed( ActionEvent e ){ jLabel12.setForeground( Color.red ); } } ); timer.setRepeats( false ); timer.start(); 

请注意, Timer是一个javax.swing.Timer ,它确保在Event Dispatch Thread上调用ActionListeneractionPerformed方法,并遵循Swing线程规则。

使用SwingWorker也可以这样做,但我会坚持使用Timer 。 如果您想使用SwingWorker ,只需在doInBackground()方法中使用Thread.sleep ,并在done()方法中更新JLabel

有点像

 class Delay extends SwingWorker { @Override public void doInBackground() { Thread.sleep( 2000 ); } @Override protected void done() { jLabel12.setForeground( Color.red ); } } 

如果要为操作指定延迟,则需要使用Timer 。