2009-03-16 10 views
1

これで困惑しましたが、おそらく誰かが以前にこの問題を抱えていて、正しい方向に向けることができます。トラブルシューティング:モーダルでモーダルではないJDialog?

私は明示的に定義所有者とモーダルとして作成した長時間実行中のタスクの進行状況、表示するために使って、JDialogを持っている:タスクが完了すると、後で

progressDialog = new JDialog(((Dialog)windowParent), true); 
    ... 
    progressDialog.setVisible(true); 

を、私は閉じます再びダイアログ:非常にまれな状況下

protected void done() { 
    SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     progressDialog.setVisible(false); 
    } 
    }); 
} 

は、ダイアログa)は閉じないと、ユーザーは(理論値)のダイアログの背後にある窓と相互作用することができる。すなわちb)に、真のモーダルではありません。これを引き起こしている可能性のあるアイデアは何ですか?残念なことに、これは非常にまれであり、今まではLinuxシステム上でしか起こりませんでした。これはスイングのバグでしょうか、おそらく何か間違っていますか?

+0

ためSun Blogとそれに伴うJavadocあなたが本当にのためにinvokeLaterが必要ですあなたを隠している? GUIを介して呼び出された可能性が最も高いので、すでにEDT上にあると推測しています。 – willcodejavaforfood

+0

可視性の設定はGUI操作であるため、EDT以外のスレッドからdone()が呼び出されるとすぐにinvokeLater()を呼び出す必要があります。これは安全なことです。 EDTに電話をしても傷つくことはありません。 –

答えて

1

私はあなたの問題に決定的な解決策を提供することはできませんが、Linux上のモーダルダイアログであらゆる種類の奇妙な動作を見たことがあります。

私たちの販売時点管理システムでは、非常に最小限の「flwm」ウィンドウマネージャを使用しました。これは、最も信頼性が高く、望ましいプロパティを提供したためです。しかし、現代のLinuxデスクトップにはそれをお勧めしません。モダリティ自体については

:あなたは、Java 6を使用することができます場合は、JDK6モダリティの変更と機能強化に表情を持っている場合があります:Dialog.ModalExclusionType

関連する問題