以前の投稿で 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();
}
}