【问题标题】:Animation Thread and EDT动画线程和 EDT
【发布时间】:2011-10-23 17:48:35
【问题描述】:

正如我在earlier post 上与 Inerdia 讨论的那样,
有些事情仍然很奇怪当我在一些 JPanel 中(EDT 肯定 - 我检查了方法检查)然后我调用了一些动画线程(线程扩展线程)开始,在线程内部我不是 EDT 通过检查.
所以我想我应该是因为动画应该在 EDT 上,所以我用 runnable 和 invokeAndWait() 包装了 animate 方法,但仍然在我不在 EDT 上的动画线程中得到它,同时调用该代码,正如我之前所说在 EDT 上,所以,我的 invokeLater 似乎没有将该动画放在 EDT 上?这是为什么?

相关代码(在使用 runnable 包装 animate 方法并传递给稍后调用之前:
因此,在 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();                       
    }
}

【问题讨论】:

    标签: java swing applet thread-safety event-dispatch-thread


    【解决方案1】:

    SuspendedAnimation.run() 内部,您不是在 EDT。那是你需要使用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();                       
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-15
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 2023-03-16
      • 2013-01-20
      相关资源
      最近更新 更多