Java – Viewport
定義:
(1)ビューポイントの基準点(表示されているテキストエリアの左上)の座標
(2)3行目のテキストの左上の座標
テキストエリアのテキストを(1)から3行目までスクロールさせたとき、(3)’ のラインと(3)のラインが重なるようにビューポイントを定義したいと思います。
このようにプログラムを定義すると、テキストエリア上で一行単位のスクロールを実現することができます。
そのためには、スクロールされたとき、4行目が(3)の位置までスクロールされた時に、その行の左上の座標(2)を取得する必要があります。
JViewport jv = this.scrollPane.getViewport();
Point p = jv.getViewPosition(); //4行目1文字目のどこかの座標が入ります。
int ptm = this.textArea.viewToModel(p); //(2)の座標までの文字数(オフセットが入ります)
try{
Rectangle mtv = this.textArea.modelToView(ptm);
//取得したオフセットから、左上の座標を取得します。これが(2)です。
System.out.println(“ChangeViewState” + p + ” ptm :”+ ptm + ” mtv:” + mtv.getX() + “, ” + mtv.getY());
p.setLocation(mtv.getX(), mtv.getY());
this.scrollPane.getViewport().setViewPosition(p); //mtvの座標を新しいテキストエリアの表示位置に設定します。
}catch(Exception ex){
ex.printStackTrace(); //例外対策※2
}
getViewPositionを実行した段階では、まだ左上の座標が取得できていません。そこで、
- viewToModelメソッドによりその1文字目のオフセットを取得する
- modelToViewメソッドにより項番1の文字の左上の座標を取得する
という処理を追加することで、(2)の座標が取得できるように補正しています。
※スクロールすると、その分大きくなります
※2代表例として、テキストエリアが空の場合、例外が起こります
この応用によって、行の左上の座標を取得できるようになります。(yet)
.net(C#, VB.net)
円弧の座標
http://www.atmarkit.co.jp/fdotnet/dotnettips/377screentoclient/screentoclient.html