如何在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上调用ActionListener
的actionPerformed
方法,并遵循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 。