2011-10-23 35 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();      
     } 
    } 
}