【发布时间】: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