2008-09-02 10 views
5

モーダルなJDialogを表示する直前に簡単なアニメーションを描画するにはどうすればよいでしょうか? (すなわち、マウスのクリック点からダイアログの位置への境界線の拡張)。私はダイアログのsetVisibleメソッドで親フレームのglasspaneを描画することができると考えました。JDialogのショーでアニメーションを描画

しかし、JDialogは親に対してモーダルなので、EDTの現在のイベントがまだ完了していないため、JDialogが表示される前にEDTに描画イベントをポンピングする方法が見つかりませんでした。

答えて

1

アニメーションとは別にJDialogを表示しようとしていますか?順序を正しく設定するには、EDTに一度に渡される実行可能ファイルにこれらのアクションをバンドルする必要があります。

例:

SwingUtilities.invokeLater(new Runnable(){ 
    public void run(){ 
     doAnnimation(); 
     showDialog(); 
    } 
} 

それはあなただけのスーパークラスの実装を呼び出す前のsetVisible(..)またはshow()メソッドにdoAnnimation()ロジックを追加できるように、JDialogのをサブクラス化するのが最善かもしれません。

最後に、ダロッグのサイズを手動で設定する必要があると思います。Javaが表示される前にダイアログの実際のサイズを知っているかどうかはわかりません。表示する前にサイズを問い合わせると、あなたのアニメーションが表示されます。

0

あなたは@ rcreswickの答えを取ってそれを機能させるために少し拡張することができます。

void myShowDialog() { 
    new Thread(new Runnable() {public void run() { 
    SwingUtilities.invokeAndWait(new Runnable() { public void run() { 
     doAnimation(); 
    } }); 
    // Delay to wait for the animation to finish (if needed) 
    Thread.sleep(500); 
    SwingUtilities.invokeAndWait(new Runnable() { public void run() { 
     showDialog(); 
    } }); 
    } }).start(); 
} 

これはかなり醜いので、基本的なshowDialog()呼び出しの代わりに呼び出す必要がありますが、動作するはずです。

1

おそらく、JSE 6に含まれているSwingWorkerプロジェクトをご覧になっているかもしれません。(Link to SwingWorker)私が現在読んでいる書籍 "Filthy Rich Client"では、このツールを多く使用しています。おそらく、書籍のウェブサイトの例でヒントを見つけることができます:http://filthyrichclients.org/

0

1つの可能性は、独自のダイアログをガラスペインにペイントすることです。次に、ダイアログを完全に制御し、必要なものをペイントすることができます。ガラス窓の上のHere's a tutorial on creating animations

関連する問題