Java tutorial
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); } }