Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动画线程与EDT_Java_Swing_Applet_Thread Safety_Event Dispatch Thread - Fatal编程技术网

Java 动画线程与EDT

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

正如我与Inerdia讨论的,
当我在某个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();                       
        }
    }
}