ugnagブログ

たいした内容はありません。思いつきで書いているだけ。
開発日記がメインかな。

<< JTableの編集終了の動作 | main | JTableのセルカーソルの位置(その2) >>

JTableのセルカーソルの位置

ネットで調べたがわからず、自分で実験してわかった結果。
結論から言うと、JTable自体のメソッドでは取得できない模様。

しかし、以下のようにすればわかるようだ。


int rowIndex = jtable.getSelectionModel().getLeadSelectionIndex();


int colIndex = jtable.getTableHeader().getColumnModel().getSelectionModel().getLeadSelectionIndex();


ListSelectionModelのleadSelectionIndexというのが、セルカーソルの位置を記憶するためのもののようだ。

ちなみに、もうひとつ、ListSelectionModelでよくわからなかい使い方をするanchorSelectionIndexだが、

この値の使い方は、複数行選択可能なモードで、複数行を選択するためにテーブルをドラッグするが、
そのときの、選択開始となる場所のようだ。

このときセルカーソルは、マウスカーソルの位置(つまり最後に選択された位置と同じ)になる。


なので、0行目から3行目をドラッグして選択すると、

anchorSelectionIndex : 0
leadSelectionIndex : 3

となる。(セルカーソルは3行目)


また、5行目から2行目のいうように、下から上へ選択してみると、

anchorSelectionIndex : 5
leadSelectionIndex : 2

となる。(セルカーソルは2行目)


以上のことが実験でわかったので、セルカーソルはleadSelectionIndexの値ということで問題ないと思われる。



ただし、この値を取得するのに、ListSelectionModel.addListSelectionListener()を使って、
位置が変更されたタイミングで行おうとすると、注意が必要だ。

というのは、行のListSelectionModelでは、列位置だけが変わってもイベントが発生しないし、逆に列のModelでは行だけ変わっても
やはりイベントは発生しない。

また、イベントが発生する順番は、

1.行のイベント
2.列のイベント

という順番のようだが、以前は逆だったという気もするので、
順番が保証されているという前提にしてしまうのは危険だ。

さらに、行のイベントが発生した際には、列の位置は変更されていない。

つまり、縦横の位置を知るには、列のイベントでチェックするしかないが、それだと行のみの変更の際には処理できない。


全く困ったものである。




今のところ、解決策は思いつかないが、JTable#changeSelectionメソッドをオーバーライドすれば、もしかしたらうまくいく可能性が
ある。

実験してみて、結果は別途報告したいと思う。
JAVA | comments (0) | -

Comments

Comment Form

本文に書いて下さい
本文にh抜きで書いて下さい