Close

JTextComponent - Getting word at caret position

[Last Updated: Jul 4, 2018]

Following example shows how to get word at caret position. The example creates a JPopupMenu with a test menu item which on clicking prints the word at current caret position.

package com.logicbig.example;

import javax.swing.*;
import javax.swing.text.BadLocationException;
import javax.swing.text.JTextComponent;
import javax.swing.text.Utilities;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class TextComponentWordAtCaretUtil {

  public static void main(String[] args) {
      JTextArea ta = new JTextArea(5, 5);
      ta.addMouseListener(createPopupListener(ta));
      JFrame frame = createFrame("JTextComponent word at caret example");
      frame.add(new JScrollPane(ta));
      frame.setVisible(true);
  }

  private static MouseListener createPopupListener(JTextComponent tc) {
      JPopupMenu popupMenu = new JPopupMenu();
      JMenuItem menu = popupMenu.add(new JMenuItem("Test"));
      popupMenu.add(menu);
      menu.addActionListener(e -> {
          String word = getWordAtCaret(tc);
          System.out.println(word);

      });
      return new MouseAdapter() {
          @Override
          public void mouseReleased(MouseEvent e) {
              if (e.isPopupTrigger()) {
                  int rightClickPosition = tc.viewToModel2D(e.getPoint());
                  tc.setCaretPosition(rightClickPosition);
                  popupMenu.show(tc, e.getX(), e.getY());
              }
          }
      };
  }

  private static String getWordAtCaret(JTextComponent tc) {
      try {
          int caretPosition = tc.getCaretPosition();
          int start = Utilities.getWordStart(tc, caretPosition);
          int end = Utilities.getWordEnd(tc, caretPosition);
          return tc.getText(start, end - start);
      } catch (BadLocationException e) {
          System.err.println(e);
      }

      return null;
  }

  public static JFrame createFrame(String title) {
      JFrame frame = new JFrame(title);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setSize(new Dimension(800, 700));
      return frame;
  }
}

Console output:

produce

Example Project

Dependencies and Technologies Used:

  • JDK 10
  • Maven 3.3.9

Getting word at caret position Select All Download
  • text-component-word-at-caret
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • TextComponentWordAtCaretUtil.java

    See Also