1

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

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

有没有办法在用户释放鼠标按钮时得到通知,以便我只能在用户完成调整大小时更改分形大小?

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

4

3 回答 3

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

您仍然可以将此与 Andrews 的建议结合使用,以使用您拉伸的图像,直到计算实际完成。

于 2012-04-19T14:22:06.950 回答
1
  • 您已经查看了HierarchyListener,您可以在其中使用HierarchyBoundsListener的接口监听HierarchyEvent

  • 基本上没有错ComponentListener,但是您必须将预期的事件包装到Swing Timer,在事件重复的情况下,只能调用Timer#restart(),输出Swing Timer应该是Swing Action

于 2012-04-19T14:10:47.290 回答
0

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

于 2013-12-25T01:00:18.720 回答