読者です 読者をやめる 読者になる 読者になる

スパゲッティ生産所

コードの走り書きとかメモとか日常のこととか

JavaFXアプリケーション製作中に作ったライブラリの話(未完成)

これはJavaFX Advent Calendar2013の20日目のエントリです。昨日はyumix_hさんの「JavaFXでiPhone風のメールクライアントを作る」でした。明日はもじゃ変さんのエントリです。


現在、JavaFXを使ったTwitterクライアントを製作中(なぜかTwitterクライアント作ってる人多いですね)です。デスクトップアプリケーションとして作っているので、もちろんUserStreamの機能を付けるのですが、Favorited通知やRT通知の際に画面の隅にちょっとした通知ウィンドウを出す機能が欲しくなりました。
しかし、JavaFXにはウィンドウを座標指定で出すことはできるのですが、右上とか右下という指定で出すことは出来ないようです。
そこで、その機能を自分で制作し、ライブラリとして活用することにしました。
なんかうまく動かないところがあるので未完成です。

以下にライブラリのコードを載せます

gist8048855

右下に配置する場合は、

Stage stage = new Stage();

//stageの設定をこの間に書く

NotificationWindow nw = new NotificationWindow(stage);
nw.setShowplace(NotificationWindow.LOWER_RIGHT);
nw.showNotificationWindow();

とかすると右下に指定したウィンドウを表示します。
ウィンドウを表示する時間も指定可能で、

nw.showtime(5);

と書けば5秒でそのウィンドウが自動的に閉じられます。

ライブラリの中でやってることは、

Rectangle2D sb = Screen.getPrimary().getVisualBounds();

で解像度を取得、

nstage.getScene().getRoot().prefWidth(-1);
nstage.getScene().getRoot().prefHeight(-1);

でウィンドウの大きさを取得して、

int X = 解像度のWidth - ウィンドウのWidth - 調整値
int Y = 解像度のHeight - ウィンドウのHeight - 調整値

を計算して、出たXとYを

nstage.setX(X);
nstage.setY(Y);

してるだけです。してるだけなので、Windowsだとうまく動きますが、MacやLinuxで上や左にツールバーみたいなのがあるとその分だけ表示がずれる問題が残ってます。
解像度をScreen.getPrimary().getVisualBounds()で取得しているので、解像度にはツールバーなどの幅を除いた値が入ってるのですが、setX()やsetY()の原点はツールバーなどは関係なく画面の左端になっているのが原因です。多分仕様なのでどうしようもないですが・・・(洒落ではないですよ?)
この問題を解決するには、実行されているデスクトップの環境(ツールバーとかdockがどこにあってどのくらいの大きさなのか~とか)を取得することが必要なのですが、Screenクラスにはこういう情報は入っていないようで・・・・。こういう情報を取得する方法を知ってる方が居たら教えて下さい。
上の問題点さえ解決できれば、ライブラリは一応完成します。その場合は、ライブラリとしてきちっと公開する予定です。

こういうAdvent Calendarのようなものに参加するのは初めてで、緊張しながら書きました。いい勉強にもなったので参加してよかったと思います
また来年も参加したいと思うので、それまでにしっかりと勉強したいと思います
おわり