import java.awt.Color; import java.awt.Insets; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SwingUtilities; import javax.swing.text.BadLocationException; import javax.swing.text.Utilities; public class NumberedTextArea implements ComponentListener, KeyListener { private static final long serialVersionUID = 1L; private JTextArea textArea, numberArea; private boolean areaLineBreak = true; private boolean numberLineBreak = true; private String datNam = "test.txt"; private static final int ROWS = 20, COLS = 60; public NumberedTextArea() { init(); } private void init() { textArea = new JTextArea(ROWS, COLS); textArea.setMargin(new Insets(0, 10, 0, 10)); textArea.setLineWrap(areaLineBreak); textArea.setWrapStyleWord(areaLineBreak); textArea.addComponentListener(this); textArea.addKeyListener(this); textArea.setText(ladeDatei(datNam)); JScrollPane sp = new JScrollPane(); sp.setViewportView(textArea); sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); numberArea = new JTextArea(); gibNummern(); numberArea.setMargin(new Insets(0, 4, 0, 4)); numberArea.setBackground(new Color(240, 240, 255)); numberArea.setForeground(new Color(180, 180, 180)); numberArea.setEditable(false); sp.setRowHeaderView(numberArea); JFrame frame = new JFrame(); frame.add(sp); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } private String ladeDatei(String datName) { File file = new File(datName); if (!file.canRead() || !file.isFile()) { System.err.println("Datei nicht vorhanden oder nicht lesbar!"); System.exit(0); } FileReader fr = null; int c; StringBuffer buff = new StringBuffer(); try { fr = new FileReader(file); while ((c = fr.read()) != -1) { buff.append((char) c); } fr.close(); } catch (IOException e) { e.printStackTrace(); } return buff.toString(); } public void gibNummern() { StringBuilder sb = new StringBuilder(); int zeilenZahl = textArea.getLineCount(); int textLength = textArea.getText().length(); if (!areaLineBreak & zeilenZahl != 0) { for (int i = 0; i < zeilenZahl; i++) { sb.append(String.valueOf(i + 1) + "\n"); } } try { if (numberLineBreak && areaLineBreak) { Pattern p = Pattern.compile(System.getProperty("line.separator")); sb.append("1\n"); int n = 1; for (int i = 0; i < textLength; i++) { int lineEnd = Utilities.getRowEnd(textArea, i); int lineStart = Utilities.getRowEnd(textArea, i + 1); if (lineEnd < lineStart) { String s = textArea.getText().substring(lineEnd, lineStart); Matcher m = p.matcher(s); boolean result = m.find(); if (!result) { sb.append("\n"); } else { n++; sb.append(String.valueOf(n) + "\n"); } } } } else if (!numberLineBreak && areaLineBreak) { int n = 0; for (int i = 0; i < textLength; i++) { int lineEnd = Utilities.getRowEnd(textArea, i); int lineStart = Utilities.getRowEnd(textArea, i + 1); if (lineEnd < lineStart) { n++; sb.append(String.valueOf(n) + "\n"); } } sb.append(String.valueOf(++n) + "\n"); } } catch (BadLocationException e1) { e1.printStackTrace(); } numberArea.setText(sb.toString()); } public void componentHidden(ComponentEvent e) { } public void componentMoved(ComponentEvent e) { } public void componentResized(ComponentEvent e) { gibNummern(); } public void componentShown(ComponentEvent e) { } public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) { gibNummern(); } public void keyTyped(KeyEvent e) { } public static void main(String[] args) { SwingUtilities.invokeLater(() -> new NumberedTextArea()); } }