2012-10-07 26 views
2

我想知道如何在Java中的Swing應用程序中添加時間延遲,我使用了Thread.sleep(time),並且我也使用了SwingWorker,但它不起作用。這裏是我的代碼部分:如何在Java Swing應用程序中添加簡單的延遲?

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解決我的疑惑。

+1

首先,永遠不要把延遲到事件調度線程,並始終只更新從與UI的例子EDT。其次,我會看看[javax.swing.Timer](http://docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html)和[示例](http ://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html) – MadProgrammer

回答

5

線下面是一個使用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();    
     }   
    }  
} 
+0

我會稍後檢查,我需要睡覺恩謝謝大家 –

2

如果您想爲操作指定延遲,您將需要使用Timer

+0

延遲一個動作,例如2秒 –

4

好東西你刪除了Thread.sleep,因爲這會讓你的用戶界面在這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(); 

注意,Timerjavax.swing.Timer,這保證了ActionListeneractionPerformed方法被調用,在事件指派線程,尊重Swing線程規則。

這也可能與SwingWorker,但我會堅持Timer爲此。如果您想使用SwingWorker,則可以簡單地在doInBackground()方法中使用Thread.sleep,並在done()方法中更新JLabel

東西沿着

class Delay extends SwingWorker<Void, Object> { 
@Override 
public void doInBackground() { 
    Thread.sleep(2000); 
} 

@Override 
protected void done() { 
    jLabel12.setForeground(Color.red); 
} 
} 
+0

+1擊敗我吧 – MadProgrammer

+0

@MadProgrammer,但你提供了一個SSCCE,而我只是提供了一些片段(不需要啓動我的IDE) – Robin

+0

我應該有一個目前建立的示例目錄:P – MadProgrammer