Java: desplácese a texto específico dentro de JTextArea

Estoy tratando de implementar una característica dentro del progtwig actual que estoy escribiendo y quiero aprender a desplazarme hacia abajo para encontrar texto específico dentro de un JTextArea. Por ejemplo, digamos que tengo lo siguiente:

JTextArea area = new JTextArea(someReallyLongString); 

someReallyLongString representaría un párrafo, o una pieza de texto muy grande (en la cual la barra de desplazamiento vertical sería visible). Y entonces, lo que estoy tratando de hacer es desplazarme hacia abajo a un texto específico dentro de ese área de texto. Por ejemplo, supongamos que algunosReallyLongString contengan la palabra “el” cerca del medio de la barra de desplazamiento (lo que significa que esta palabra no está visible), ¿cómo me desplazaría hacia abajo para ese texto específico?

Gracias, cualquier ayuda sería muy apreciativa.

Este es un MUY básico ejemplo. Esto básicamente recorre el documento para encontrar la posición de la palabra dentro del documento y asegura que el texto se mueva al área visible.

También destaca el partido

enter image description here

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

Esto debería funcionar:

 textArea.setCaretPosition(posOfTextToScroll); 

Puede obtener posOfTextToScroll según el modelo de Document . Lea sobre esto, en el Javadoc.

Primero, obtenga el texto que establece en el área de texto y cree un índice usando un mapa para mantener el carácter y la posición en la que lo encuentre.

En base a esto, la respuesta previa sugerida utilizó setCaretPosition utilizando el valor recuperado del mapa.