忍者ブログ

マインのブログ

マインが何かを気まぐれに書く日記です。

[PR]

カテゴリー:

2017/07/26(Wed)19:42

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

No.|CommentTrackback

JTableをプログラムからスクロールするとヘッダーがずれて表示される

カテゴリー:プログラムとか

2010/08/01(Sun)21:01

えと、今日のブログプログラム編です。
1日の出来事編は1つ前の記事を見てください。

話は金曜にさかのぼります。
金曜に仕事中、変なものを見つけたと報告があった。
JTableをスクロールするとテーブルヘッダーがずれるというもの。
定時間際の発見だったので、ちょっと残って調査してました。
スクロールといってもスクロールバーをマウスで動かすのではなく、
Component.scrollRectToVisible()を使ったスクロールです。
scrollRectToVisible()を使ってテーブルの左上のセルを表示させようとすると
テーブルヘッダーだけがスクロールする前の位置にあるというもの。
別の場所でのscrollRectToVisible()はちゃんと動いているので、
現象の起こったところがおかしいはず。

自分で作ったカスタムコンポーネントがいけないんだろうなーと思って
色々いじったり、デバッガで止めてみたりしたけど結局よく分からなかった。
1時間くらいやって、あまり残業するなと言われ帰りました。
で、今日、と言うか今さっき。
原因究明のため、ちょっとプログラムを組んでみた。
上にも書いたとおり、コンポーネントの問題ではなく、
処理フローの問題と思われる。
というかそれしかない。

1つ思い当たる節があって、プログラムを組んでみたら
すぐに現象が発生した。
テストプログラムの概要は以下のとおり。
・ボタンを押すと表示されているテーブルが切り替わる(メニューみたいなイメージ)
・テーブルを切り替えるとき、テーブルの左上のセルが表示されるようにする
現象発生操作は以下のとおり。
1.テーブルAを表示させる。
ss0.JPG

2.列幅を大きくして右にスクロールさせる
ss1.JPG

3.テーブルBを表示させる
ss01.JPG

4.またテーブルAを表示させると・・・
ss2.JPG

ちなみに処理的には下みたいな感じでやってます。
1.ボタンが押されたら表示しているテーブルを持つパネルを右のパネルからはずす
2.表示するテーブルをスクロールする
3.右のパネルに表示するテーブルを持つパネルを追加する
4.右のパネルを再描画(revalidateとrepaint)をする

詳しい人はこれ見ただけで原因が分かると思いますが、
オレにはすぐには分かりませんでした。
問題を解決するためには上の2と3の手順を逆にします。
問題の現象が起こった原因は想像でしかないのですが、
表示されていないコンポーネントの座標は計算できないという
Swing(というかJavaのGUI関係かな?awtとか)の仕様によるものかと。

通常ならスクロールペインを操作する時は表示されているため、
スクロールするたびにヘッダーの位置を計算して表示しているのではないかなと思います。
しかし、上の手順でスクロールしてしまうと、
親コンポーネントがないので座標を算出できず、
前のヘッダー位置で表示してしまっているのではないかと。
まあ、つまり、モノを表示する時はコンポーネント階層を組んだあとに
座標関係を更新(スクロールとか)して、それから「表示」させろということですかね。
つーか、テーブル部分はちゃんとスクロールできてるんだから
ヘッダーもスクロールしてくれよ・・・。

ということで、一応問題解決。
明日報告しますか。
でも、自動的にスクロールしなくていいよと言われたからなー。
元に戻して終わりですかね。
Javaむずいっす。

明日も仕事か。
行きたくねーな・・・。

拍手[1回]

PR

No.1991|Comment(0)Trackback(0)

Comment

Comment Write
Name
Title
Mail
URL

Pass Vodafone絵文字 i-mode絵文字 Ezweb絵文字 

Trackback

URL :