2012-02-20 15 views
1

最初のUIアクションとして、親フレームのないモーダルJDialogを表示するアプリケーションがあります。モーダル親なしJDialogはフォーカスを取得しません

public LoginDialog(Frame owner, Config config, Object... params) { 
    super((Frame)null, true); 

それは、残念ながら、それが表示されたら、それが前面に表示されますが、それがフォーカスをつかむしないという迷惑な特性を有しています。

ユーザは、スタートメニューをダブルクリックしてアプリケーションを起動した後、マウスを使用して「ログイン」ダイアログを選択し、情報を入力する必要があります。

正面に表示されているときに、このJDialogがフォーカスを取得する方法はありますか?

私はsetVisible(true)の呼び出し中にinvokeLaterの前、後、および経由で "requestFocus"を呼び出そうとしましたが、これらのどれも効果がないようです。

モーダルダイアログでフォーカスを取得するにはどうすればよいですか?

更新:この問題は、バックグラウンドの「待機ウィンドウ」を表示しようとするコードです。このウィンドウは、ログインダイアログの「バック」にハックとして表示され、ダイアログが消えたときに「お待ちください」というメッセージが表示されます。アプリケーションによって作成された最初のウィンドウだったので、それに焦点を当てました。このハックを使ってイベントディスパッチスレッドの中で対話を再度フォーカスさせる方法があるのか​​どうかはわかりませんが、ハッキングを解除して正しく処理することで修正しました。

+0

requestFocus()の代わりに[requestFocusInWindow()](http://docs.oracle.com/javase/1.5.0/docs/api/javax/swing/JComponent.html#requestFocusInWindow())を使用します。希望が助けることができる。 –

+0

は、コードを追加せずに動作するだけで、問題を再現できませんでした。 – kleopatra

答えて

2

まず、モーダルダイアログは親なしです。モーダルダイアログのポイントは、親に表示され、親にアクセスすることを許可しないという点です。

したがって、最初の推奨は非モーダルにすることです。私はそれが動作すると信じています。

私はちょうどそのようなダイアログを作成しようとしており、フォーカスに問題はありません。あなたのコードを簡素化するために、おそらく試してみてください。

JDialog d = new JDialog(); 
    d.setSize(200, 200); 
    d.setVisible(true); 

これは私の作品と私はあなたのために働くだろうと信じています。この簡単なコードを実際のアプリケーションコードに変更してみましょう。ある時点で作業が中止され、問題のある場所が表示されます。

私がこのarticleで説明したトリックの使用に何も役立たない場合は、タイトル「Portable window activation」を探します。私はそれが助けてくれることを願う

+1

巧妙な例がうまくいきます...ログインプロンプトの前に最初に表示される「スプラッシュ画面」もあ​​ります。何とか焦点を合わせる。 –

1

1)あなたはJDialog内容とinvokeLater()

または最善とsafiest方法内にラップ示すコンテナを作成している必要がありますがModalityTypesまたはModal for parent

3)一つだけのために設定する必要が

2)コンテナからはModalがアプリケーションライフサイクルにある可能性があります

2

RequestFocusListenerを使用する可能性のある修正については、Dialog Focusを参照してください。私はJOptionPaneダイアログでフォーカスを設定するのに成功しました。

関連する問題