gpt4 book ai didi

java - 在 Swing 事件处理程序中呈现无闪烁的 JComponent

转载 作者:搜寻专家 更新时间:2023-11-01 03:25:11 24 4
gpt4 key购买 nike

我正在编写一个简单的 Java Swing 应用程序,它被设计为类(class)的演示。该程序的目的是可视化递归方法(特别是迷宫的递归解决方案)的进展。我希望能够在递归方法执行时更新 JComponent 的外观,因此从 Swing 的角度来看,不能从 Timer 类单独触发更新,我认为这是动画的常用方法。

我的第一个想法是每当我想重绘可视化时调用 repaint()。但是递归方法本身是在 JButton 的事件处理程序中调用的,这意味着对 repaint() 的所有调用都被延迟,直到事件处理程序终止——我所看到的只是动画的最后一帧。我发现如果我改为调用 update() ,我可以让绘图立即发生,如下所示:

getRootPane().getContentPane().update(getGraphics());
try {
Thread.sleep(25);
} catch (Exception e) {
}

这几乎可以工作,除了动画闪烁。我知道 Swing 是双缓冲的,但显然 getGraphics 给了我 Activity 缓冲区而不是后台缓冲区。我看不到任何可以让我访问后台缓冲区的方法。

因此,我正在寻找一种解决方案,允许我在递归过程中重新绘制组件并提供无闪烁动画。有没有办法在事件处理程序执行时激活内置双缓冲?尝试实现我自己的缓冲系统会更好吗?或者我正在尝试使用 Swing 做的事情是不可能的/不可取的?

(最后一点,这是我在这里的第一篇文章。我试着写一个很好的问题,但如果我遗漏了什么,请告诉我,下次我会努力做得更好。谢谢!)

最佳答案

首先,你应该 not be executing long-running actions in the Event Dispatch Thread ,我认为这是您的动画闪烁的原因之一。

所以我建议启动一个线程,在按下按钮时执行您的递归方法(并且可能在工作完成之前停用它)。

要渲染动画,您可以从递归方法中调用 myComponent.repaint() 或启动一个 Swing Timer(感谢 @mKorbel 指出),它基本上看起来像这样:

ActionListener repaintTrigger = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
myComponent.repaint();
}
};
new Timer(25, repaintTrigger).start();

我推荐后一种方法,因为您的递归方法可能不知道任何有关 Swing 组件的信息(除非您通过“ProgressListener”或其他方式将其解耦)。

看来你不仅仅是初学者,我只是给出了一些关于该怎么做的提示。如果您需要更多信息,请随时询问。

关于java - 在 Swing 事件处理程序中呈现无闪烁的 JComponent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15775338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com