我正在尝试在视图和视口坐标之间进行转换。但是 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
大于一条线。我不需要 JTextArea “模型”坐标(文本中的偏移量)。我需要真正的二维坐标。
视图位置不应为 (0,0),因为视口中的第一个可见字符实际上位于 JTextArea 的第 3 行。
关于在使用 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);
}