[PR]
2024/11/23(Sat)23:10
No.|Comment|Trackback
マインが何かを気まぐれに書く日記です。
カテゴリー:プログラムとか
2009/10/06(Tue)20:32
久しぶりの1日2回のブログ。
仕事でやってたプログラミングのことをちょろちょろと。
興味のない人は見なくていいですよ。
面白くないですし。
えーと、今回書くのは前にも書いたComponentTitledBorderのこと。
サンプルはてんぷらさんに載ってますが、
てんぷらさんのソースが修正されていました。
しかし、(オレとしては)これでもまだ不十分だったので色々修正を加えました。
不十分だったところは、前にも書いたもののとおり、
階層構造のコンポーネントをタイトルに置けないことでした。
まずはてんぷらさんのソースをダウンロード。
そのあとpaintBorder()のSwingUtilities.paintComponent()の前あたりに、
タイトルコンポーネント(compと言う変数だったかな?)のdoLayout()とvalidate()を呼ぶ。
そしてpaintBorder()の最後にpaintBorder()の第1引数のComponentをrepaint()をする。
このままだと無限ループのような形になるのでフラグでも立ててやって、
最初の描画の時だけ2回描画するようにします。
なぜ2回描画する必要があるのか。
それは知りません。
こうやらないとちゃんと表示されません。
Javaの仕様です。
たぶん。
これでボタンとかチェックボックスとか色々持ったパネルをタイトルコンポーネントにして表示できます。
次はdispatchEvent()の修正。
まず、タイトルコンポーネントが階層構造になっているかをチェック。
Containerのインスタンスであるかをinstanceofで調べればいいです。
あとは、コンテナー内のコンポーネント全てに対しててんぷらさんのdispatchEventの
中にあることみたいなのを書いていけばOKです。
再帰を使えばすぐ出来ます。
しかし、色々触っていると分かると思いますが、
ビミョーにonMouseとかがうまくいってません。
解決法は、タイトルコンポーネント内のそれぞれのコンポーネントに対して
MouseEventをいじってそれをdispatchEventに渡すようにします。
何のこっちゃと思うかもしれませんが、タイトルコンポーネント内の
全てのコンポーネントに以下のようなことします。
まず、「以前のマウス座標」を保持するメンバー変数を用意します。
最初にdispatchEventに渡されたMouseEvent(mEventとする)が、
MouseEvent.MOUSE_RELEASEであるかとチェックします。
もしMOUSE_RELEASEならそのままmEventをdispatchEventに渡してやります。
もしMOUSE_RELEASEでなければ次に、SwingUtilities.convertMouseEvent()で
帰ってきたMouseEvent(meとする)の座標がコンポーネント内にあるかを調べます。
component.contains(me.getPoint())ですぐに調べられます。
もし、コンポーネント内にあるのであれば、次に以前のマウス座標が
そのコンポーネント内にあったかを調べます。
ここで、今の座標がコンポーネント内かつ前の座標もコンポーネント内であれば、
同じコンポーネントの中をマウスが移動したことになるので
dispatchEventにはmeをそのまま渡してやります。
もし、今の座標がコンポーネント内だけど以前の座標がコンポーネント外であれば
そのコンポーネントにマウスが入ったことになるので、
meのIDをMouseEvent.MOUSE_ENTEREDに置き換えたMouseEventを
dispatchEventに渡してやります。
もし、今の座標がコンポーネント内でなければ
次に以前の座標がコンポーネント内であるかをチェックします。
以前の座標がコンポーネント内であるなら
マウスはコンポーネントを出たことになるので、
meのIDをMouseEvent.MOUSE_EXITEDに置き換えたMouseEventを渡してやればOKです。
これで少なくともオレが想定するComponentTitltedBorderの動作が出来てると思います。
ソースとサンプルプログラムは・・・。
いつかと言うことで・・・。
今週末くらいに元気でゲームに飽きてたら作ります。
まあ、これだけ出来ててもまだ完璧じゃないんですけどねー。
タイトルコンポーネントを置けるところが左上一箇所だけなんで。
中央とかに置けるように出来たらかっこいいですねー。
と、取り留めない文章になりました。
ごめんなさい。
コードがないとプログラムのことをブログで書くのは無理ですな。
なんとなく雰囲気だけでも分かってもらえるとかなりうれしいです。
No.1829|Comment(0)|Trackback()
URL :