我正在编写一个简单的 Java Swing 应用程序,该应用程序被设计为课程演示。该程序的目的是可视化递归方法的进度(特别是迷宫的递归解决方案)。我希望能够在递归方法执行时更新 JComponent 的外观,因此从 Swing 的角度来看,不能从 Timer 类单独触发更新,我认为这是动画的常用方法。
我的第一个想法就是每当我想重绘可视化时调用 repaint() 。但是递归方法本身是在 JButton 的事件处理程序中调用的,这意味着对 repaint() 的所有调用都会延迟到事件处理程序终止——我看到的只是动画的最后一帧。我发现如果我改为调用 update() 可以立即进行绘图,如下所示:
getRootPane().getContentPane().update(getGraphics());
try {
Thread.sleep(25);
} catch (Exception e) {
}
这几乎可以工作,除了动画闪烁。我知道 Swing 是双缓冲的,但显然 getGraphics 给了我活动缓冲区而不是后台缓冲区。我看不到任何可以让我访问后台缓冲区的方法。
所以我正在寻找一种解决方案,它允许我在递归中间重新绘制组件并给我一个无闪烁的动画。有没有办法在事件处理程序执行时激活内置的双缓冲?尝试实现我自己的缓冲系统会更好吗?或者我试图用 Swing 做的事情是不可能的/不可取的?
(作为最后一点,这是我在这里的第一篇文章。我试着写一个很好的问题,但如果我遗漏了什么,请告诉我,我下次会努力做得更好。谢谢!)