Java 当用户完成调整JFrame大小时收到通知
我在JFrame中有一个分形生成组件(JPanel的子类)。当用户调整窗口大小时,将分形更新为新大小需要相当长的时间 我目前在JPanel上有一个ComponentListener,但是每当用户在拖动窗口边框时移动鼠标时,就会调用它的ComponentResistized事件。这意味着分形被告知要多次调整大小,然后慢慢地(经过几分钟)增长到新的大小 是否有一种方法可以在用户释放鼠标按钮时得到通知,以便我只能在用户完成调整大小后更改分形大小 其他人在侦听器连接到JFrame时会发生这种情况,但由于某些原因,这对我(和)不起作用。Java 当用户完成调整JFrame大小时收到通知,java,swing,timer,jframe,listener,Java,Swing,Timer,Jframe,Listener,我在JFrame中有一个分形生成组件(JPanel的子类)。当用户调整窗口大小时,将分形更新为新大小需要相当长的时间 我目前在JPanel上有一个ComponentListener,但是每当用户在拖动窗口边框时移动鼠标时,就会调用它的ComponentResistized事件。这意味着分形被告知要多次调整大小,然后慢慢地(经过几分钟)增长到新的大小 是否有一种方法可以在用户释放鼠标按钮时得到通知,以便我只能在用户完成调整大小后更改分形大小 其他人在侦听器连接到JFrame时会发生这种情况,但由于
- 您已经查看了,您可以在何处使用接口进行侦听
- 基本上,
没有问题,但是您必须将预期的事件包装到ComponentListener
,如果事件重复,只需调用Swing Timer
,Timer\restart()
的输出应该是Swing Timer
Swing Action
- 您已经查看了,您可以在何处使用接口进行侦听
- 基本上,
没有问题,但是您必须将预期的事件包装到ComponentListener
,如果事件重复,只需调用Swing Timer
,Timer\restart()
的输出应该是Swing Timer
Swing Action
您仍然可以将此与Andrews建议结合使用一个图像,将其拉伸直到计算实际完成。而不是在每次接收到接收事件时开始计算,您只能在接收到最后一个事件后使用计时器(例如伪代码)开始计算(或者至少是我直接在这里输入的代码,而不是在IDE中输入的代码)
您仍然可以将此与Andrews的建议结合使用一个图像,将其拉伸直到计算实际完成。虽然有点晚,但似乎没有人找到正确的答案。我发现,当您在ComponentListener(
ComponentResistized
块)中调用child.updateUI()
时对于窗口,此子对象自行调整大小并更新其内容。使用计时器是不安全的。虽然有点晚,但似乎没有人找到正确的答案。我发现,当您在ComponentListener(ComponentResistized
块)中调用child.updateUI()
时对于窗口,该子窗口会自动调整其大小并更新其内容。使用计时器是不安全的。您能否解释为什么帧渲染缓慢,这可能是需要研究的问题。通常帧渲染非常快,但我正在允许用户以Lua脚本的形式输入自己的分形公式。我正在使用LuaJ运行脚本正在减慢渲染速度。调整窗口大小时分形是否有实质性的变化?如果只是“拉伸”,您可以尝试将其绘制到缓冲区图像
,然后绘制图像。是的,根据窗口是否已被放大,分形将以或多或少的细节再次生成收缩,所以这不仅仅是一个拉伸。你能解释为什么帧渲染缓慢,这可能是应该研究的。通常帧渲染相当快,但是我正在允许用户以Lua脚本的形式输入自己的分形公式。我正在使用LuaJ运行脚本,这会减慢渲染速度。有什么问题吗调整窗口大小时的分形会发生什么情况?如果它只是“拉伸”,您可以尝试将其绘制到缓冲区图像
,然后绘制图像。是的,分形会根据窗口是否被放大或缩小而以或多或少的细节再次生成,因此它不仅仅是拉伸。不幸的是,您好erarchyBoundsListener
的行为方式与ComponentListener
相同。不过,我会尝试使用计时器。谢谢。嗯,在您的评论中包含计时器之前,我刚刚建议了计时器。这使我的回答看起来非常多余。+1对于建议,不幸的是,HierarchyBoundsListener
的行为方式与Comp>相同onentListener
。不过,我会尝试使用计时器。谢谢。嗯,我只是在你的评论中包含计时器之前建议了它。这使得我的答案看起来非常多余。+1对于建议,许多人,许多视图,我使用布尔值和计时器#在所有侦听器中重新启动,+1编辑,并且在350-600毫秒内非常重要,因为所有优秀的mediaplayer有cca半秒延迟,我认为这是相当可以接受的任何人,许多观点,我使用布尔与定时器#重新启动所有侦听器,+1编辑和重要的350-600毫秒,因为所有好的mediaplayer都有cca半秒延迟,我认为这是相当可以接受的
private Timer recalculateTimer = new Timer( 20, myRecalculateActionListener );
constructor(){
recalculateTimer.setRepeats( false );
}
@Override
public void componentResized(ComponentEvent e){
if ( recalculateTimer.isRunning() ){
recalculateTimer.restart();
} else {
recalculateTimer.start();
}
}