2009-08-15 2 views

答えて

1

私は、ある種のマッピングアプリケーションを適切に書いていると思いますか? :-)

スイングタイマークラスを使用して、イベントなしで指定された時間が経過するまで待つことができます。コードは次のとおりです。

/** 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(); 
    } 
} 
+0

詳細な例を書くのに感謝します。この解決策は私の要求に合っているようです。 –

0

これはできません。しかし、SingleWorkerThreadを使用すると、処理されるイベントの数を最小限に抑えることができます。

1

これは従来の方法では不可能ですが、恐れ入ります。 componentResized()は、すべての中間サイズ変更に対して呼び出され、現在の呼び出しが最後の呼び出しであるかどうかを判断する方法はありません。

厳密に言えば、あなたがしようとしていることは、従来のことではありません。データの読み込みは高価なIO操作であり、通常は、ボタンの押下などのより直接的なUI操作の後にユーザーが期待しているときに最もよく実行されます。コンポーネントのサイズは、フレームが最大化されたり、Windows 7の新しいAero操作などの別の場所での操作の結果として配置されるなど、無害な理由によって変更される可能性があります。do結果としてIOを実行します。サイジングのたとえば、Google Readerでは、ブラウザウィンドウ上でスクロールバーを動かした結果、RSSフィードから古い投稿を読み込むことができます。これは素晴らしい機能であり、明示的なロードボタンの必要性を排除しますが、古いポストを探しているユーザーが直接操作します。意識的な行動であり、意識的なものではない。

私の主張は、この作業をどのように行うか非常に注意する必要があると思います。遅いIO操作でユーザーを罰して、ウィンドウをサイズ変更したので単純に待機させるのはユーザーフレンドリーな方法ではありません。

あなたの質問には、UIがどのようなものか、コンポーネントがどのようなものか、どのようにリサイズされているか、データをロードしている場所など、貴重な情報はほとんどありません。ここにいくつかの提案があります:私は彼らが助けてくれることを願っています。

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

2.あなたが最初のサイズ変更イベントに必要以上
ロードより多くのデータをロードするために熱心にして、その後、あなたが使用していないデータを拒否またはキャッシュのどちらか。テーブルやリストの行を埋める場合は、これがより良いアプローチかもしれません。表形式のデータは、通常、ロードして解析するのが簡単です。

3合理的な時間が
最初のサイズ変更イベントが1秒カウントダウンとタイマーを開始し停止するようにサイズ変更するための通過を許可します。その後のサイズ変更イベントは、1秒のカウントダウンをリセットします。ある時点で、最終的なサイズ変更イベントが発生します。その後、サイズ変更イベントがカウントダウンをリセットして期限切れになることはありません。この時点で、Timerが負荷をかけます。

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

関連する問題