Java Swing How to - Add rule to JTextArea according to the text entered








Question

We would like to know how to add rule to JTextArea according to the text entered.

Answer

/*w w w  . j a v a2  s.  co  m*/
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Segment;
import javax.swing.text.Utilities;

public class Main extends JFrame {

  private JTextArea textArea = new JTextArea();

  public Main() {
    textArea.getDocument().addDocumentListener(new DocumentListener() {

      @Override
      public void changedUpdate(DocumentEvent e) {
        update(e);
      }

      @Override
      public void insertUpdate(DocumentEvent e) {
        update(e);
      }

      @Override
      public void removeUpdate(DocumentEvent e) {
        update(e);
      }

      private void update(DocumentEvent e) {
        List<String> lines = getLines(textArea);
        String lastLine = lines.get(lines.size() - 1);
        int tabbedTextWidth = Utilities.getTabbedTextWidth(new Segment(lastLine.toCharArray(), 0, lastLine.length()),
            textArea.getFontMetrics(textArea.getFont()), 0, null, 0);
        int lineHeight = getLineHeight(textArea);
        if (lines.size() * lineHeight > textArea.getHeight()
            || tabbedTextWidth > textArea.getWidth()) {
          System.out.println("Too many lines!");
        }
      }
    });

    getContentPane().add(textArea);
  }

  private static List<String> getLines(JTextArea textArea) {
    int lineHeight = getLineHeight(textArea);
    List<String> list = new ArrayList<String>();
    for (int num = 0;; num++) {
      int i = textArea.viewToModel(new Point(0, num * lineHeight));
      int j = textArea.viewToModel(new Point(0, (num + 1) * lineHeight));
      if (i == 0 && j == 0) {
        continue;
      }
      if (textArea.getDocument().getLength() == i && i == j) {
        break;
      }
      String s = removeTrailingNewLine(textArea.getText().substring(i, j));
      list.add(s);
    }
    return list;
  }

  private static int getLineHeight(JTextArea textArea) {
    return textArea.getFontMetrics(textArea.getFont()).getHeight();
  }

  private static String removeTrailingNewLine(String s) {
    if (s.endsWith("\n")) {
      return s.substring(0, s.length() - 1);
    } else {
      return s;
    }
  }
  public static void main(String[] args) {
    Main test = new Main();
    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    test.setBounds(20,20,400,100);

    test.setVisible(true);
  }
}