用户完成JFrame大小调整后收到通知

时间:2012-04-19 13:37:19

标签: java swing timer jframe listener

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

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

当用户释放鼠标按钮时,是否有通知方式,以便我只能在用户完成大小调整后更改分形大小?

其他人在将侦听器附加到JFrame时会发生reported这种情况,但由于某种原因,这对我(以及others)不起作用。

3 个答案:

答案 0 :(得分:4)

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

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();
  }
}

你仍然可以将这与安德鲁斯的建议相结合,使用你伸展的图像,直到计算结束。

答案 1 :(得分:1)

  • 您已查看HierarchyListener,您可以通过HierarchyEvent

  • 的界面收听HierarchyBoundsListener
  • ComponentListener基本上没有任何问题,但您必须将预期事件包装到Swing Timer,如果事件重复,只调用Timer#restart(),从Swing Timer输出{1}}应为Swing Action

答案 2 :(得分:0)

有点晚了,但看起来没有人找到正确的答案。我发现当您在窗口的ComponentListener(child.updateUI()块)内调用componentResized时,此子项会自行调整大小并更新其内容。使用计时器是不安全的。