Поток анимации и EDT - PullRequest
       17

Поток анимации и EDT

0 голосов
/ 23 октября 2011

Как я уже обсуждал с Inerdia в более раннем посте ,
, что-то все еще странно. Когда я нахожусь в каком-то JPanel (EDT точно - я проверил с помощью метода check), а затем я вызываю некоторыепоток анимации (поток расширяет поток), чтобы начать, внутри потока я не на EDT проверкой.
Так что я думаю, что так и должно быть, потому что анимация должна быть на EDT, поэтому я поместил метод animate в runnable и invokeAndWait (), но все же понял, что в потоке анимации я не на EDT, а вызов этого кода, как я уже говорил ранее, на EDT, поэтому мой invokeLater, похоже, не помещает эту анимацию на EDT?это почему?

Соответствующий код (перед переносом метода animate в runnable и передачей для последующего вызова:
Итак, на 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 Ответ

1 голос
/ 23 октября 2011

Внутри 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();                       
        }
    }
}
...