ビュー座標とビューポート座標の間で変換しようとしています。しかし、JViewport/JScrollpaneは文書化されているようには機能しないようです。JViewport.toViewCoordinates()
明らかにそうではない場合でも、ビューは常にコンポーネントの左上にあると考えています。
String text = "blahblahblah\nblahblah\nblah";
JFrame frame = new JFrame("title");
JTextArea textArea = new JTextArea(text, 1, 30); // shows only one line
frame.add(new JScrollPane(textArea));
frame.pack();
frame.setVisible(true);
textArea.setCaretPosition(text.length()); // now showing the last line
JViewport viewport = ((JViewport)textArea.getParent());
viewport.getViewRect(); // returns java.awt.Rectangle[x=0,y=0,width=330,height=16]
viewport.getViewPosition(); // returns java.awt.Point[x=0,y=0]
viewport.toViewCoordinates(new Point(0,0)); // returns java.awt.Point[x=0,y=0]
上記は不自然な例です。私の実数JTextArea
は1行よりも大きいです。JTextAreaの「モデル」座標(テキスト内のオフセット)は必要ありません。本物の2D座標が必要です。
ビューポートで最初に表示される文字は実際にはJTextAreaの3行目にあるため、ビューの位置は(0,0)であってはなりません。
JScrollPaneを使用するときにビューとコンポーネントの座標を変換する方法に関する他の提案はありますか?
- - 追加した - -
これも失敗します。
SwingUtilities.convertPoint(viewport,0,0, textArea);
(java.awt.Point) java.awt.Point[x=0,y=0]
- - 追加した - -
これが私が受け取った回答に基づいた最終的な作業バージョンです。java.awt.Point[x=0,y=32]
それは私が期待したものを示しています。
@Test
public void test() throws InterruptedException {
String text = "blahblahblah\nblahblah\nblah";
JFrame frame = new JFrame("title");
JTextArea textArea = new JTextArea(text, 1, 30);
frame.add(new JScrollPane(textArea));
frame.pack();
frame.setVisible(true);
textArea.setCaretPosition(text.length());
final JViewport viewport = ((JViewport)textArea.getParent());
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run() {
System.out.println(viewport.getViewPosition());
}
});
Thread.sleep(1000);
}