我的 JTextArea 包含数千行,但并非所有行都一次可见。我想以编程方式滚动到 textArea 的特定行,以便该行可见。我发现 scrollPane 有一个方法 scrollRectToVisible 但我没有成功。谁能建议我如何实现目标。一个可行的代码片段对我来说真的很有帮助。谢谢。
问问题
2642 次
2 回答
3
scrollRectToVisible(...) 应该可以工作。确保在文本区域而不是滚动窗格上调用 scrollRectToVisible(...)。如果这不起作用,那么我猜你没有得到正确的 Rectangle 滚动到。发布说明问题的SSCCE 。
另一种方法是使用Text Utilities的 gotoStartOfLine(...) 方法。如果您愿意,也可以使用 centerLineInScrollPane(...) 方法。
于 2011-04-17T00:25:40.850 回答
1
我想你已经回答了这个问题。我在这段时间里创建了我的 SSCCE,所以如果不是你的,我会为了其他人的利益而发布它。
import java.awt.BorderLayout;
import java.awt.Rectangle;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.text.BadLocationException;
public class TestScrollRectToVisible extends JPanel {
private static final int MAX_LOOP = 10000;
private DefaultListModel listModel = new DefaultListModel();
private JTextArea textarea = new JTextArea(20, 30);
private JList jList = new JList(listModel);
JScrollPane textareaScrollPane = new JScrollPane(textarea);
public TestScrollRectToVisible() {
jList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
String text = jList.getSelectedValue().toString();
text += ": ";
String docText = textarea.getText();
int index = docText.indexOf(text);
if (index < 0) {
return;
}
try {
Rectangle rect = textarea.modelToView(index);
textarea.scrollRectToVisible(rect);
} catch (BadLocationException e1) {
e1.printStackTrace();
}
}
}
});
jList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
StringBuilder strBuilder = new StringBuilder();
for (int i = 0; i < MAX_LOOP; i++) {
String text = String.valueOf(i);
listModel.addElement(text);
strBuilder.append(text + ": abcdefghijklmnopqrstuvwxyz" + "\n");
}
textarea.setText(strBuilder.toString());
setLayout(new BorderLayout());
add(textareaScrollPane, BorderLayout.CENTER);
add(new JScrollPane(jList), BorderLayout.EAST);
}
private static void createAndShowUI() {
JFrame frame = new JFrame("TestScrollRectToVisible");
frame.getContentPane().add(new TestScrollRectToVisible());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
于 2011-04-17T00:57:16.087 回答