Wie kann man die Zeile und Spalte der Cursorposition in einer JTextArea ermitteln?
Die Beispielklasse definiert in initComponents()
je eine JTextArea
und ein JLabel
zur Anzeige der Position. Zur Ermittlung der
Cursorposition implementiert die Beispielklasse das
Interface CaretListener
und meldet die JTextArea
bei diesem an. JTextArea
stellt drei
Methoden zum Auslesen des numerischen Offset der
Cursorposition bereit:
getLineEndOffset(int line) |
Offset (Zeichenzahl) des Zeilenendes der gegebenen Zeile |
getLineStartOffset(int line) |
Offset des Zeilenbeginns (Zeichenzahl bis zum Zeilenbeginn) der gegebenen Zeile |
getLineOfOffset(int offset) |
Zeilennummer der Cursorposition |
Entsprechend eingesetzt, können mit diesen Methoden
Zeile und Spalte der Cursorposition ausgelesen werden.
Der CaretListener sorgt mit seiner Methode caretUpdate(CaretEvent e)
dafür, dass dies nach jeder Änderung der
Cursorposition erfolgt.
Zuerst wird mittels getCaretPosition()
der Offset der Cursorposition ausgelesen. Offset
bezeichnet hier die Gesamtzahl der Zeichen, die sich in
der Komponente vor dem Cursor befinden. Das Zählen
beginnt also bei 0. Anschließend werden die
Zeilennummer der aktuellen Cursorposition und dann der
Offset des Zeilenbeginns ermittelt.
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.text.BadLocationException;
public class CursorPosition implements CaretListener {
private JTextArea area;
private JLabel label;
public CursorPosition(){
initComponents();
}
private void initComponents() {
area = new JTextArea();
area.addCaretListener(this);
label = new JLabel();
JFrame frame = new JFrame("Cursor-Position");
frame.add(area, BorderLayout.CENTER);
frame.add(label, BorderLayout.NORTH);
frame.setSize(new Dimension(400,300));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public void caretUpdate(CaretEvent e) {
int cPos = area.getCaretPosition();
try {
int lineNumber = area.getLineOfOffset(cPos); // beginnt bei 0
int startOffset = area.getLineStartOffset(lineNumber);
String str = area.getText(startOffset, (cPos - startOffset));
int len = str.length();
label.setText("Zeile: " + new Integer(lineNumber + 1).toString()
+ " | Spalte: " + new Integer(len + 1).toString());
} catch (BadLocationException e1) {
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new CursorPosition());
}
}
In der Folge stellt man die Länge des Textes
zwischen Zeilenbeginn und Cursorposition fest. Diese ist
identisch mit der Spaltenzahl der Cursorposition. Die
Stringlänge ermittelt die Methode getText(int
beginn, int ende)
. Bei der Ausgabe addiert
man nach Belieben 1, um die jeweilige Position bei 1
beginnen zu lassen.
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.