Java 动画线程与EDT
正如我与Inerdia讨论的,Java 动画线程与EDT,java,swing,applet,thread-safety,event-dispatch-thread,Java,Swing,Applet,Thread Safety,Event Dispatch Thread,正如我与Inerdia讨论的, 当我在某个JPanel(当然是EDT,我用方法检查进行了检查)中,然后调用某个动画线程(线程扩展线程)来启动时,有些事情仍然很奇怪,在线程内部,我没有通过检查进行EDT。 所以我想我应该是因为动画应该在EDT上,所以我用runnable和invokeAndWait()包装了animate方法,但在动画线程中,我没有在EDT上,而调用代码时,正如我前面所说是在EDT上,所以,我的调用器似乎没有将动画放在EDT上?为什么呢 相关代码(在将animate方法包装为run
当我在某个JPanel(当然是EDT,我用方法检查进行了检查)中,然后调用某个动画线程(线程扩展线程)来启动时,有些事情仍然很奇怪,在线程内部,我没有通过检查进行EDT。
所以我想我应该是因为动画应该在EDT上,所以我用runnable和invokeAndWait()包装了animate方法,但在动画线程中,我没有在EDT上,而调用代码时,正如我前面所说是在EDT上,所以,我的调用器似乎没有将动画放在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();
}
}
void动画(ArrayList i_TrainRoadTrack){
ArrayList PlayerRailoadPanelTrack=获取相关铁路(i_TrainRailRoadTrack);
新的吊杆配置(playerRailoadPanelTrack).start();
jPanelBoard1.GetGameManager().EmptyPlayerSolution();
}
私有类挂起扩展线程
{
私人ArrayList m_PlayeraIloadPanelTrack;
公共吊杆化(ArrayList i_PlayeraIloadpanelTrack)
{
m_PlayerRailoadPanelTrack=i_PlayerRailoadPanelTrack;
}
@凌驾
公开募捐
{
m_IsAnimationNeeded=真;
用于(JPanelRailLoadSquare当前RailLoadSquare:m_PlayerRailoadPanelTrack)
{
System.out.println(“在事件调度线程上:+SwingUtilities.isEventDispatchThread());
currRailoadSquare.SetGoingTrain();
重新油漆();
尝试
{
睡眠(150);
}
捕获(中断异常e){}
currRailoadSquare.UnSetGoingTrain();
重新油漆();
}
}
在SuspendedAnimation.run()
的内部,您不在EDT上。您需要在EDT上使用调用器()
,而不是调用动画()
:
@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();
}
}
}