gpt4 book ai didi

java - JScrollPane中的JTextArea, View 坐标平移

转载 作者:行者123 更新时间:2023-12-02 08:30:15 27 4
gpt4 key购买 nike

我正在尝试在 View 和视口(viewport)坐标之间进行转换。但 JViewport/JScrollpane 似乎并不像记录的那样工作。 JViewport.toViewCooperatives()认为 View 始终位于组件的左上角,尽管情况显然并非如此。

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“模型”坐标(文本中的偏移量)。我需要真正的二维坐标。

View 位置不应该是 (0,0),因为视口(viewport)中的第一个可见字符实际上位于 JTextArea 的第三行。

关于使用 JScrollPane 时如何在 View 和组件坐标之间转换还有其他建议吗?

--- 添加 ---

这也失败了。

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);
}

最佳答案

问题是获取 viewPosition() 的方法在视口(viewport)实际滚动之前执行。这是因为有时 Swing 会将代码添加到事件线程的末尾以供稍后处理。

通常可以通过将代码包装在 SwingUtilities.invokeLater() 中来解决此问题,以便在 Swing 完成所有处理后执行代码。然而,在下面的简单演示中,我发现我需要添加两个 invokeLater() 方法。我不知道为什么。

上下移动插入符号,您将看到 View 位置发生变化。第二个值将包含正确的位置:

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;

public class Test5
{
public static void createAndShowGUI()
{
String text = "one\ntwo\nthree\nfour\nfive";
JFrame frame = new JFrame("title");
JTextArea textArea = new JTextArea(text, 1, 30); // shows only one line
JScrollPane scrollPane = new JScrollPane( textArea );
frame.add(scrollPane);
frame.pack();
frame.setVisible(true);

final JViewport viewport = scrollPane.getViewport();

textArea.addCaretListener( new CaretListener()
{
public void caretUpdate(CaretEvent e)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
System.out.println("First : " + viewport.getViewPosition() );

SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
System.out.println("Second: " + viewport.getViewPosition() );
}
});
}
});
}
});

textArea.setCaretPosition(text.length());
}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}

关于java - JScrollPane中的JTextArea, View 坐标平移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3588100/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com