[PR]
2024/11/23(Sat)19:51
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
No.|Comment|Trackback
マインが何かを気まぐれに書く日記です。
2024/11/23(Sat)19:51
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
No.|Comment|Trackback
カテゴリー:プログラムとか
2014/12/23(Tue)21:59
No.2190|Comment(0)|Trackback
カテゴリー:プログラムとか
2013/04/06(Sat)22:28
No.2180|Comment(1)|Trackback
カテゴリー:プログラムとか
2010/08/01(Sun)21:01
えと、今日のブログプログラム編です。
1日の出来事編は1つ前の記事を見てください。
話は金曜にさかのぼります。
金曜に仕事中、変なものを見つけたと報告があった。
JTableをスクロールするとテーブルヘッダーがずれるというもの。
定時間際の発見だったので、ちょっと残って調査してました。
スクロールといってもスクロールバーをマウスで動かすのではなく、
Component.scrollRectToVisible()を使ったスクロールです。
scrollRectToVisible()を使ってテーブルの左上のセルを表示させようとすると
テーブルヘッダーだけがスクロールする前の位置にあるというもの。
別の場所でのscrollRectToVisible()はちゃんと動いているので、
現象の起こったところがおかしいはず。
自分で作ったカスタムコンポーネントがいけないんだろうなーと思って
色々いじったり、デバッガで止めてみたりしたけど結局よく分からなかった。
1時間くらいやって、あまり残業するなと言われ帰りました。
で、今日、と言うか今さっき。
原因究明のため、ちょっとプログラムを組んでみた。
上にも書いたとおり、コンポーネントの問題ではなく、
処理フローの問題と思われる。
というかそれしかない。
1つ思い当たる節があって、プログラムを組んでみたら
すぐに現象が発生した。
テストプログラムの概要は以下のとおり。
・ボタンを押すと表示されているテーブルが切り替わる(メニューみたいなイメージ)
・テーブルを切り替えるとき、テーブルの左上のセルが表示されるようにする
現象発生操作は以下のとおり。
1.テーブルAを表示させる。
2.列幅を大きくして右にスクロールさせる
3.テーブルBを表示させる
4.またテーブルAを表示させると・・・
ちなみに処理的には下みたいな感じでやってます。
1.ボタンが押されたら表示しているテーブルを持つパネルを右のパネルからはずす
2.表示するテーブルをスクロールする
3.右のパネルに表示するテーブルを持つパネルを追加する
4.右のパネルを再描画(revalidateとrepaint)をする
詳しい人はこれ見ただけで原因が分かると思いますが、
オレにはすぐには分かりませんでした。
問題を解決するためには上の2と3の手順を逆にします。
問題の現象が起こった原因は想像でしかないのですが、
表示されていないコンポーネントの座標は計算できないという
Swing(というかJavaのGUI関係かな?awtとか)の仕様によるものかと。
通常ならスクロールペインを操作する時は表示されているため、
スクロールするたびにヘッダーの位置を計算して表示しているのではないかなと思います。
しかし、上の手順でスクロールしてしまうと、
親コンポーネントがないので座標を算出できず、
前のヘッダー位置で表示してしまっているのではないかと。
まあ、つまり、モノを表示する時はコンポーネント階層を組んだあとに
座標関係を更新(スクロールとか)して、それから「表示」させろということですかね。
つーか、テーブル部分はちゃんとスクロールできてるんだから
ヘッダーもスクロールしてくれよ・・・。
ということで、一応問題解決。
明日報告しますか。
でも、自動的にスクロールしなくていいよと言われたからなー。
元に戻して終わりですかね。
Javaむずいっす。
明日も仕事か。
行きたくねーな・・・。
No.1991|Comment(0)|Trackback()
カテゴリー:プログラムとか
2010/06/22(Tue)21:44
No.1972|Comment(0)|Trackback()
カテゴリー:プログラムとか
2010/05/04(Tue)18:32
No.1947|Comment(0)|Trackback()
カテゴリー:プログラムとか
2010/02/11(Thu)20:51
No.1920|Comment(0)|Trackback()
カテゴリー:プログラムとか
2010/01/06(Wed)00:31
No.1896|Comment(0)|Trackback()
カテゴリー:プログラムとか
2010/01/01(Fri)00:49
No.1891|Comment(0)|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()
カテゴリー:プログラムとか
2009/09/18(Fri)00:20
No.1811|Comment(0)|Trackback()