Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.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 swing线程中循环发出的跳跃式重绘_Java_Multithreading_Swing_Repaint - Fatal编程技术网

如何减轻java swing线程中循环发出的跳跃式重绘

如何减轻java swing线程中循环发出的跳跃式重绘,java,multithreading,swing,repaint,Java,Multithreading,Swing,Repaint,我有一些java代码,用于在3个上下文中缩放动画:1。alt滚动,2。按下按钮时会出现一个150毫秒的静态动画(一个10毫秒睡眠的循环),以及3。通过点击线程中的一个循环(一个100毫秒睡眠的循环,只要按住鼠标按钮,它就会继续缩放)完成的按钮 对于缩放增量,每个机制调用相同的方法。在该方法中,在每个轴上独立管理缩放(即在x轴上缩放和在y轴上缩放) 然而,尽管机制1和机制2工作得很好,但我在机制3上遇到了麻烦。有时重绘是在中途完成的,这意味着重绘有时会在每次标注更新之间触发,这会导致缩放动画看起来

我有一些java代码,用于在3个上下文中缩放动画:1。alt滚动,2。按下按钮时会出现一个150毫秒的静态动画(一个10毫秒睡眠的循环),以及3。通过点击线程中的一个循环(一个100毫秒睡眠的循环,只要按住鼠标按钮,它就会继续缩放)完成的按钮

对于缩放增量,每个机制调用相同的方法。在该方法中,在每个轴上独立管理缩放(即在x轴上缩放和在y轴上缩放)

然而,尽管机制1和机制2工作得很好,但我在机制3上遇到了麻烦。有时重绘是在中途完成的,这意味着重绘有时会在每次标注更新之间触发,这会导致缩放动画看起来不稳定

我尝试了多种不同的方法来控制重新喷漆,以获得不同程度的成功

  • 尝试在命令行上设置-Dswing.volatileImageBufferEnabled=false-根本不起作用
  • 尝试在不同的地方立即打电话-根本不起作用
  • 尝试使用RepaitManager.currentManager(c).markCompletelyClean(c)和RepaitManager.currentManager(c).markCompletelyDirty(c)的组合-虽然这可以防止重新绘制,但我无法想出如何在每次缩放增量时可靠地绘制
  • 尝试使用setVisible(布尔)-这可以在每个维度的更新之间停止不稳定的重新绘制,但会导致面板在每次重新绘制时“闪烁”

  • 也许我还没有弄清楚把事情叫进来的正确顺序。有人知道我该怎么办吗?我怀疑发生这种情况的原因是因为更新是从一个线程生成的,而其他机制是连续发生的,但我知道没有其他方法可以使用swing检测按钮按下时的点击保持事件。

    你能发布一个重现问题的方法吗?“重绘有时会在每次维度更新之间触发,这会导致缩放的动画看起来不稳定“这听起来像是你的画引起了副作用。由系统触发的额外重绘不应更改动画。它应该只绘制两次相同的帧或绘制一个临时帧。确保你的动画不依赖于
    paint
    /
    paintComponent
    中的副作用。在每次维度更新后都会调用notifyObservators,尽管我从跟踪中不太了解它的来源(看起来像是核心代码,但我对java有些陌生)。缩放单个维度是由其他按钮处理的,但是我正在使用的按钮可以放大两个维度,并且它连续使用两个调用相同的代码。这些notifyObserver调用导致在维度更新之间重新绘制。所以也许你是对的,我依赖于《1&《2》中合并的重新绘制的副作用?这是否证实了你对Radiodef的见解?我不确定我是否有专业知识来生产MCVE@copeg。我是一个perl的人,开始帮助处理这个java项目的票证,我已经从大学本科学习了一些非常繁琐的java技能。我不太熟悉观察者的东西,但是如果你的观察者在你的控制之外收到通知,那么是的,同样的事情也会适用。这只是系统调用是否会导致动画状态发生更改。制作动画的一种更为惯用的方法是使用
    javax.swing.Timer
    (如我所示,尽管那里的讨论基本上是不相关的),并更直接地更新状态,这样您就有了更严格的控制。如果我误解了你所说的“干巴巴的”是什么意思,那么请对我猜的行为进行更具体的描述。