モーダルJDialogを表示する直前に単純なアニメーションを描画する最良の方法は何でしょうか? (つまり、マウス クリック ポイントからダイアログの位置まで境界線を拡張します)。ダイアログのメソッドで親フレームのガラス板に描画できると思いましたsetVisible
。
ただし、JDialog は親に対してモーダルであるため、EDT の現在のイベントがまだ完了していないため、JDialog が表示される前に描画イベントをEDTに送り込む方法が見つかりませんでした。
モーダルJDialogを表示する直前に単純なアニメーションを描画する最良の方法は何でしょうか? (つまり、マウス クリック ポイントからダイアログの位置まで境界線を拡張します)。ダイアログのメソッドで親フレームのガラス板に描画できると思いましたsetVisible
。
ただし、JDialog は親に対してモーダルであるため、EDT の現在のイベントがまだ完了していないため、JDialog が表示される前に描画イベントをEDTに送り込む方法が見つかりませんでした。
アニメーションとは無関係に JDialog を表示しようとしていますか? 順序を正しく設定するには、これらのアクションをランナブルにまとめて、EDT に一度に渡す必要がある場合があります。
例えば:
SwingUtilities.invokeLater(new Runnable(){
public void run(){
doAnnimation();
showDialog();
}
}
スーパークラスの実装を呼び出す前に、doAnnimation() ロジックを setVisible(..) または show() メソッドに追加できるように、JDialog をサブクラス化するのが最善の方法です。
最後に、dalog のサイズを手動で設定する必要があると思います。ダイアログが表示される前に Java がダイアログの実際のサイズを認識するかどうかは覚えていません。表示する前にサイズを照会します。
JSE 6 に含まれている SwingWorker Project を見たことがあるかもしれません。(SwingWorker へのリンク)私が現在読んでいる「Filthy Rich Client」という本では、彼らはこのツールをよく使用しています。書籍の Web サイト ( http://filthyrichclients.org/ ) の例でヒントを見つけることができるかもしれません。
@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 つの可能性は、Glass Pane に独自のダイアログをペイントすることです。次に、ダイアログを完全に制御して、好きなようにペイントできます。 これは、Glass Pane でアニメーションを作成するためのチュートリアルです。