コンポーネントのサイズ変更が完了したときにインスタンスを見つける方法

StackOverflow https://stackoverflow.com/questions/1281582

  •  16-09-2019
  •  | 
  •  

質問

私のアプリケーションでは、コンポーネントのサイズが変更された場合にデータをフェッチします。ユーザーがサイズ変更操作を完了するまでフェッチを遅らせたいと考えています。 ComponentListener イベント componentResized ウィンドウのサイズが変更されるたびに起動します。

役に立ちましたか?

解決

私はあなたがpropablyいくつかの種類のマッピングアプリケーションを書いていると言うだろうか? : - )

あなたはどんなイベントなしで渡され、指定した時間まで待機するスイングTimerクラスを使用することができます。ここでは、コードがあります:

/** Time to wait */
private final int DELAY = 1000;
/** Waiting timer */
private javax.swing.Timer waitingTimer;

/**
 * Handle resize event.
 */
public void componentResized(ComponentEvent e) 
{
  if (this.waitingTimer==null)
  {
    /* Start waiting for DELAY to elapse. */
    this.waitingTimer = new Timer(DELAY,this);
    this.waitingTimer.start();
  }
  else
  {
    /* Event came too soon, swallow it by resetting the timer.. */
    this.waitingTimer.restart();
  }
}

/** 
 * Actual resize method
 */
public void applyResize()
{
  //...
}

/**
 * Handle waitingTimer event 
 */
public void actionPerformed(ActionEvent ae)
{
  /* Timer finished? */
  if (ae.getSource()==this.waitingTimer)
  {
    /* Stop timer */
    this.waitingTimer.stop();
    this.waitingTimer = null;
    /* Resize */
    this.applyResize();
  }
}

他のヒント

残念ながら、これは従来の手段では不可能です。 componentResized() 中間のサイズ変更ごとに呼び出され、現在の呼び出しが最後になるかどうかを判断する方法はありません。

厳密に言えば、あなたがやろうとしていることは従来のやり方ではありません。データのロードは負荷の高い IO 操作になる可能性があり、通常は、ボタンを押すなどのより直接的な UI 操作の後で、ユーザーがアクションの結果として適切なフィードバックを表示できる場合に、データのロードを予期しているときに実行するのが最適です。コンポーネントのサイズは、Windows 7 の新しい Aero 操作など、他の場所での操作の結果としてフレームが最大化されたり配置されたりするなど、無害な理由で変更される可能性があります。

一部のアプリケーション する サイジングの結果として IO を実行します。たとえば、Google Reader は、ブラウザ ウィンドウ上でスクロールバーを移動すると、RSS フィードから古い投稿を読み込むことができます。これは優れた機能で、明示的なロード ボタンが不要になりますが、古い投稿を探しているユーザーによって直接操作されます。無意識の行動ではなく意識的な行動。

私が言いたいのは、これをどのように機能させるかについて非常に注意する必要があるということです。あえてウィンドウのサイズを変更したからといって、遅い IO 操作でユーザーを待たせるのは、ユーザーフレンドリーなアプローチではありません。

質問には、UI がどのように見えるか、コンポーネントが何であるか、サイズがどのように変更されるか、さらにはデータをどこからロードしているかについて、貴重な情報がほとんど含まれていないため、答えるのは少し難しいです。以下にいくつかの提案を示します。彼らが助けてくれることを願っています。

1.あらかじめデータをメモリに読み込んで表示するだけ
データ モデルが大きすぎない場合は、データ モデルをメモリにロードし、サイズ変更イベントごとにすぐに再描画できます。Event-Dispatch-Thread は、サイズ変更イベントを組み合わせて、リスナーがリクエストに圧倒されないようにします。これはあなたにとって初心者ではないかもしれませんが、言及する価値があります。

2.熱心にロードする
最初のサイズ変更イベントで必要以上のデータをロードし、使用しないデータを拒否するかキャッシュします。テーブルまたはリストの行を設定する場合は、これがより良いアプローチである可能性があります。表形式のデータは通常、ロードと解析が簡単です。

3.サイズ変更が停止するまで適度な時間が経過するまで待ちます
最初のサイズ変更イベントは、1 秒のカウントダウンでタイマーを開始します。後続のサイズ変更イベントがあると、1 秒のカウントダウンがリセットされます。ある時点で、最後のサイズ変更イベントが発生し、その後の後続のサイズ変更イベントがカウントダウンをリセットしないため、期限切れになります。この時点で、タイマーが負荷を自動的に実行します。

私の意見では、3 が最も安全で正確なアプローチです。最初のサイズ変更イベントでデータが読み込まれていることを視覚的に示すことでアプリケーションの応答性を高め、タイマーのカウントダウンを調整してアプリケーションの感触を正しくすることができます。

scroll top