|
ウィンドウの位置にこだわる |
||||||||
|
||||||||
警告ダイアログやエラーを示すダイアログは常に前面に表示したいところです。この手の情報はユーザに気づいてもらわなければどうしようもないのですから。 ところが、今まで Java ではこれを制御することができませんでした。 もちろん、Window#toFront メソッドを使用すれば前面に表示することもできます。しかし、他のウィンドウにフォーカスが当たってしまうと後ろに隠れてしまうのです。 それがやっと Tiger で常に前面にするメソッドが加わりました。 Window#setAlwaysOnTop(false) Window クラスなので、派生クラスである Frame, Dialog, JWindow, JFrame, JDialog の各クラスも使用することができます。
ここでは JFrame クラスを使用してみました。
実行してみると確かに常に前面に表示されます。 ところで、setAlwaysOnTop メソッドはいつコールしてもかまわないのでしょうか。これも試してみましょう。
フレームにボタンをはって、ボタンが押されたら状態を変えるようにしてみました。
ボタンが押されたら Window#isAlwaysOnTop メソッドを使用して現在の状態を調べ、AlwaysOnTop 状態であれば setAlwaysOnTop(false) をコールするようにします。逆に AlwaysOnTop 状態でなければ、AlwaysOnTop にします。 実行すると、ちゃんと切り替えられることが分かります。 ということは、いつ setAlwaysOnTop メソッドをコールしてもいいわけですね。 残念なのは、javax.swing.JOptionPane クラスです。showXXXXDialog メソッドの引数に AlwaysOnTop を指定できるようにしてもらいたかったからです。ところが、JOptionPane クラスはまったく変更なし。 ダイアログを表示させるのによく使われるのですから、こういうところも一緒に変更してくれればいいと思うのですが。前面に表示させるには JOptionPane#createDialog メソッドを使用して JDialog オブジェクトを生成し、その後生成した JDialog オブジェクトに対し setAlwaysOnTop(true) をコールするようにしなければなりません。 せっかくのユーティリティクラスなのにこんな手間をかけさせるなんて...
|
|
||||||||||
さて、話は変わります。 やはりウィンドウに関する話題ですが、ウィンドウの位置に関してです。 Java でない普通のアプリケーションを立ち上げると、OS がウィンドウの位置を調整してくれますよね。ちょっとずつずれて表示させるような感じです。 これが Tiger でできるようになりました。今まではデフォルトだと常に同じ場所にウィンドウが表示されてしまいます。他のアプリケーションのウィンドウの位置を Java のプログラム中で知ることはできないので、少しづつウィンドウをずらすということはできませんでした。 ようするにウィンドウを表示させる位置は OS にお任せというわけです。 これを行うには Window#setLocationByPlatform メソッドを使用します。
5 つのフレームを表示させるだけのサンプルですが、表示を行う前に setLocationByPlatform(true) をコールしています。
実行結果は次のようになりました。 ちゃんと並んでますね。 ところで、表示した後に setLocationByPlatform メソッドをコールしたらどうなるのでしょうか。後からでも並べ替えてくれるのでしょうか。やってみたら...
まぁ、当たり前ですね ^^;; もう 1 つ実験してみます。
setBounds メソッドや setLocation メソッドを使用してフレームの位置を指定した場合はどうなるかということです。
やってみたら、ちゃんと並んで表示されました。試しに、表示した後に setBounds メソッドをコールしたら、指定した位置に移動しました。 ということは setLocationByPlatform(true) をした場合に表示前に setBounds メソッド/setLocation メソッドで位置を指定しても無視されるということのようです。
|
|
||||
ちょっとしたことですが、こういうのがアプリケーションを作っているときに気になるところなのです。 特にダイアログが後ろに回ってしまう問題はいかんともしがたかったので、この機能追加は非常に喜ばしいです。
今回使用したサンプルはここからダウンロードできます。
(Oct. 2004) |
|