Java 当用户完成调整JFrame大小时收到通知

Java 当用户完成调整JFrame大小时收到通知,java,swing,timer,jframe,listener,Java,Swing,Timer,Jframe,Listener,我在JFrame中有一个分形生成组件(JPanel的子类)。当用户调整窗口大小时,将分形更新为新大小需要相当长的时间 我目前在JPanel上有一个ComponentListener,但是每当用户在拖动窗口边框时移动鼠标时,就会调用它的ComponentResistized事件。这意味着分形被告知要多次调整大小,然后慢慢地(经过几分钟)增长到新的大小 是否有一种方法可以在用户释放鼠标按钮时得到通知,以便我只能在用户完成调整大小后更改分形大小 其他人在侦听器连接到JFrame时会发生这种情况,但由于

我在JFrame中有一个分形生成组件(JPanel的子类)。当用户调整窗口大小时,将分形更新为新大小需要相当长的时间

我目前在JPanel上有一个ComponentListener,但是每当用户在拖动窗口边框时移动鼠标时,就会调用它的ComponentResistized事件。这意味着分形被告知要多次调整大小,然后慢慢地(经过几分钟)增长到新的大小

是否有一种方法可以在用户释放鼠标按钮时得到通知,以便我只能在用户完成调整大小后更改分形大小

其他人在侦听器连接到JFrame时会发生这种情况,但由于某些原因,这对我(和)不起作用。

  • 您已经查看了,您可以在何处使用接口进行侦听

  • 基本上,
    ComponentListener
    没有问题,但是您必须将预期的事件包装到
    Swing Timer
    ,如果事件重复,只需调用
    Timer\restart()
    Swing Timer
    的输出应该是
    Swing Action

      • 您已经查看了,您可以在何处使用接口进行侦听

      • 基本上,
        ComponentListener
        没有问题,但是您必须将预期的事件包装到
        Swing Timer
        ,如果事件重复,只需调用
        Timer\restart()
        Swing Timer
        的输出应该是
        Swing Action


      不是每次收到接收事件时都开始计算,而是只能在收到最后一个事件后使用计时器开始计算,例如,使用伪代码(或至少是我在此处直接键入的代码,而不是在IDE中键入的代码)


      您仍然可以将此与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();
        }
      }