0

以前の投稿で Inerdia と話し合ったように、
JPanel (確かに EDT - メソッド チェックでチェックした) を使用していて、いくつかのアニメーション スレッド (スレッド拡張 Thread) を呼び出して内部で開始すると、何かがまだ奇妙です。チェックでEDTに参加していないスレッド。
アニメーションは EDT である必要があるため、アニメーション メソッドを 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();                       
    }
}
4

1 に答える 1