我正在尝试在我正在编写的当前程序中实现一个功能,我想学习如何向下滚动到JTextArea中的特定文本。例如,假设我有以下内容:
JTextArea area = new JTextArea(someReallyLongString);
someReallyLongString表示一个段落,或一段非常大的文本(其中垂直滚动条可见)。所以我要做的是向下滚动到该文本区域内的特定文本。例如,假设someReallyLongString在滚动条的中间附近包含单词“the”(意思是这个单词不可见),我将如何向下滚动到该特定文本?
谢谢,任何帮助都会非常感激。
答案 0 :(得分:23)
这是一个非常基本的例子。这基本上会遍历文档以查找文档中单词的位置,并确保将文本移动到可查看区域。
它还会突出显示匹配
public class MoveToText {
public static void main(String[] args) {
new MoveToText();
}
public MoveToText() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new FindTextPane());
frame.setSize(400, 400);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class FindTextPane extends JPanel {
private JTextField findField;
private JButton findButton;
private JTextArea textArea;
private int pos = 0;
public FindTextPane() {
setLayout(new BorderLayout());
findButton = new JButton("Next");
findField = new JTextField("Java", 10);
textArea = new JTextArea();
textArea.setWrapStyleWord(true);
textArea.setLineWrap(true);
Reader reader = null;
try {
reader = new FileReader(new File("Java.txt"));
textArea.read(reader, null);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (Exception e) {
}
}
JPanel header = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.WEST;
header.add(findField, gbc);
gbc.gridx++;
header.add(findButton, gbc);
add(header, BorderLayout.NORTH);
add(new JScrollPane(textArea));
findButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Get the text to find...convert it to lower case for eaiser comparision
String find = findField.getText().toLowerCase();
// Focus the text area, otherwise the highlighting won't show up
textArea.requestFocusInWindow();
// Make sure we have a valid search term
if (find != null && find.length() > 0) {
Document document = textArea.getDocument();
int findLength = find.length();
try {
boolean found = false;
// Rest the search position if we're at the end of the document
if (pos + findLength > document.getLength()) {
pos = 0;
}
// While we haven't reached the end...
// "<=" Correction
while (pos + findLength <= document.getLength()) {
// Extract the text from teh docuemnt
String match = document.getText(pos, findLength).toLowerCase();
// Check to see if it matches or request
if (match.equals(find)) {
found = true;
break;
}
pos++;
}
// Did we find something...
if (found) {
// Get the rectangle of the where the text would be visible...
Rectangle viewRect = textArea.modelToView(pos);
// Scroll to make the rectangle visible
textArea.scrollRectToVisible(viewRect);
// Highlight the text
textArea.setCaretPosition(pos + findLength);
textArea.moveCaretPosition(pos);
// Move the search position beyond the current match
pos += findLength;
}
} catch (Exception exp) {
exp.printStackTrace();
}
}
}
});
}
}
}
答案 1 :(得分:3)
这应该有效:
textArea.setCaretPosition(posOfTextToScroll);
您可以通过posOfTextToScroll
模型获取Document
。在Javadoc中阅读它。
答案 2 :(得分:1)
首先获取您在文本区域中设置的文本,然后使用地图构建索引以保存角色以及您找到它的位置。
基于此,之前的建议使用了setCaretPosition,使用从地图中检索到的值。
答案 3 :(得分:0)
添加MadProgrammer的评论:
从Java SE 9开始不推荐使用 scrollRectToVisible(viewRect)
,并已将其替换为scrollRectToVisible2D(viewRect)
不使用不推荐使用的功能来显示文本的正确方法是:
java.awt.geom.Rectangle2D view = area.modelToView2D(pos); // View where pos is visible
area.scrollRectToVisible(view.getBounds()); // Scroll to the rectangle provided by view
area.setCaretPosition(pos); // Sets carat position to pos