2011-10-23 42 views
0

正如我Inerdia在earlier post討論,
的東西仍然是奇怪,當我在一些JPanel的是(EDT肯定,我用的方法檢查中檢查),然後我把一些動畫線程(線程擴展線程)啓動,在線程內我不通過檢查EDT。
所以我想我應該是因爲動畫應該是美國東部時間,所以我包裹着的可運行和invokeAndWait()的動畫的方法,但還是得到了在動畫線程我不是EDT,同時呼籲該代碼爲我之前說過在美國東部時間,所以,我的invokeLater似乎不把這個動畫放在EDT上?這是爲什麼?動畫線程和EDT

相關的代碼(具有可運行包裹動畫的方法和通過稍後調用之前:
所以,正對一個JPanel有一行:

Animate(trainRailRoadTrack); 

實施是:

void Animate(ArrayList<RailroadSquare> i_TrainRailRoadTrack) { 
    ArrayList<JPanelRailoadSquare> playerRailoadPanelsTrack = getRelevantRailroads(i_TrainRailRoadTrack); 
    new SuspendedAnimation(playerRailoadPanelsTrack).start(); 
    jPanelBoard1.GetGameManager().EmptyPlayerSolution(); 
} 

private class SuspendedAnimation extends Thread 
{ 
    private ArrayList<JPanelRailoadSquare> m_PlayerRailoadPanelsTrack; 

    public SuspendedAnimation(ArrayList<JPanelRailoadSquare> i_PlayerRailoadPanelTrack) 
    { 
     m_PlayerRailoadPanelsTrack = i_PlayerRailoadPanelTrack; 
    } 

    @Override 
    public void run() 
    { 
     m_IsAnimationNeeded = true; 
     for (JPanelRailoadSquare currRailoadSquare: m_PlayerRailoadPanelsTrack) 
     { 
      System.out.println("Is on Event dispatch thread: "+SwingUtilities.isEventDispatchThread()); 
      currRailoadSquare.SetGoingTrain(); 
      repaint();        
      try 
      { 
       Thread.sleep(150); 

      } 
      catch (InterruptedException e){} 
      currRailoadSquare.UnSetGoingTrain(); 
      repaint();      
    } 
} 

回答

1

SuspendedAnimation.run()內部,你在而不是上。這就是你需要使用invokeLater()的地方,而不是在致電Animate()時:

@Override 
public void run() 
{ 
    // We're outside the EDT in most of run() 
    m_IsAnimationNeeded = true; 
    for (JPanelRailoadSquare currRailoadSquare: m_PlayerRailoadPanelsTrack) 
    { 
     SwingUtilities.invokeAndWait(new Runnable() { 
      // The code that "talks" to Swing components has to be put on 
      // the EDT 
      currRailoadSquare.SetGoingTrain(); 
      repaint(); 
     }); 

     // We want to keep sleeping outside the EDT. 
     try 
     { 
      Thread.sleep(150); 
     } 
     catch (InterruptedException e){} 

     SwingUtilities.invokeAndWait(new Runnable() { 
      currRailoadSquare.UnSetGoingTrain(); 
      repaint();      
     } 
    } 
}