2016-01-24 84 views
0

我正在使用scheduledexecutorservice来执行动画绘制图形(一次一个顶点和一个边)。我在逐步更新实际UI时遇到了问题,而我看不到实际的动画,但只能看到最终的图形。我应该怎么做才能防止UI冻结(scheduledexecutorservice)

private Runnable newRunnable() { 
    return new Runnable() { 

     @Override 
     public void run() { 
      // this method just adds the graph to a JPanel 
      displayDiagram(); 
     } 
    }; 
} 

private void animate() { 
    executorService.schedule(newRunnable(), 1500, TimeUnit.MILLISECONDS); 
    executorService.shutdown(); 
    try { 
     executorService.awaitTermination(1, TimeUnit.SECONDS); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    executorService = new ScheduledThreadPoolExecutor(1); 
} 

我想达到的目标是能够得出一个顶点和一个边缘,每一次更新UI,然后等待1500毫秒,直到显示整个图形再次做到这一点。

当动态创建图时,方法动画会被多次调用。

+0

这种“_executorService.awaitTermination_”排队到Swing事件队列的后台线程中进行的任何摇摆电话究竟它在锡上说的 - 它**等待**。不要称这个。使用'SwingWorker'。 –

回答

3

awaitTermination是一种阻塞方法。相反,您应该使用SwingWorker(并利用其功能publish/process功能)或Swing Timer

看看Concurrency in SwingWorker Threads and SwingWorkerHow to use Swing Timers更多细节

也许像this

+2

行动中的并发 - 同时回答问题。 –

+0

平行思维:P – MadProgrammer

+0

我尝试使用计时器,但我没有成功。在处理剩下的代码之前,我不知道如何等待计时器完成。 – roniko1994

3

您的代码不服从Swing线程规则,它使状态变化到Swing应用程序关闭的Swing事件调度线程。我建议你使用SwingWorker作为后台任务以及它的发布/处理方法对,以线程安全的方式将信息传递回Swing GUI。如果您需要使用其他方法来创建你的后台线程,则一定要通过使用类似

SwingUtilities.invokeLater(() -> { 
    // swing call here 
}); 
相关问题