JTextArea, in welcher Zeile befindet sich der Cursor

Status
Nicht offen für weitere Antworten.

The_S

Top Contributor
Wie kann ich herausfinden, in welcher Zeile sich bei einem JTextArea der Cursor befindet? Hab mir mal den LineListener angeschaut, aber irgendwie werd ich da net so ganz schlau draus, außerdem kann ich kein tut auf java.sun.com finden.
 
Äh, ja ... LineListener war wohl ein bisschen falsch ... sollte mir das Zeug wohl auch mal durchlesen 😳 . Mit was mach ich das dann?
 
Versuche das hier. (hab's nicht ausprobiert)
Code:
int caretPos = textArea.getCaretPosition();
if(caretPos>=0) {
  AbstractDocument doc = (AbstractDocument)textArea.getDocument();
  Element element = doc.getParagraphElement(caretPos);
  System.out.println(Integer.toString(element.getParentElement().getElementIndex(element.getStartOffset())+1));
}
Es muss auch einfacher gehen, bin zu faul nachzuschauen. 😉
 
Danke! Das ist nur für mich ziemlich spanisch! Kannst du das vielleicht mit ein paar Kommentaren versehen, dass ich wenigstens weiß, was ich mache :wink:
 
Läuft es überhaupt? War nur so ins Blaue geschossen, ohne es zu prüfen.

Code:
// Cursorposition holen
int caretPos = textArea.getCaretPosition(); 
// Wenn Cursor überhaupt drin
if(caretPos>=0) { 
  // Document des Texfeldes holen
  AbstractDocument doc = (AbstractDocument)textArea.getDocument(); 
  // Textelement an Cursorposition holen (in JTextarea ist i.d.R. 1 Element = 1 Zeile)
  Element element = doc.getParagraphElement(caretPos); 
  // Im Übergeordneten Element prüfen, an welcher Stelle das gefundene sich befindet. Es ist dann gleich die Zeilennummer
  System.out.println(Integer.toString(element.getParentElement().getElementIndex(element.getStartOffset())+1)); 
}
 
Nö, tuts doch net ???:L . Gibt mir die Position des Cursors zurück! Hät ich vielleicht besser testen sollen :bae: . Jemand ne Idee?
 
so:

Code:
	public static int getCaretRowPosition(JTextComponent comp) {
		try {
			int y = comp.modelToView(comp.getCaretPosition()).y;
			int line = y/getRowHeight(comp);
			return ++line;
		} catch (BadLocationException e) {
		}
		return -1;
	}

	public static int getCaretColumnPosition(JTextComponent comp) {
		int offset = comp.getCaretPosition();
		int column;
		try {
			column = offset - Utilities.getRowStart(comp, offset);
		} catch (BadLocationException e) {
			column = -1;
		}
		return column;
	}
 
Ohh, ihr macht mich verrückt. :autsch: Ich musste extra nachschauen.
Meine Lösung funktioniert. Zusätzlich kannst Du auch noch die Spalte
ausgeben.

spalte = 1 + caretPos - element.getStartOffset()
 
Roar hat gesagt.:
Code:
	public static int getCaretColumnPosition(JTextComponent comp) {
		int offset = comp.getCaretPosition();
		int column;
		try {
			column = offset - Utilities.getRowStart(comp, offset);
		} catch (BadLocationException e) {
			column = -1;
		}
		return column;
	}

Das versteh ich.

Roar hat gesagt.:
Code:
	public static int getCaretRowPosition(JTextComponent comp) {
		try {
			int y = comp.modelToView(comp.getCaretPosition()).y;
			int line = y/getRowHeight(comp);
			return ++line;
		} catch (BadLocationException e) {
		}
		return -1;
	}

Aber das hat Erklärungsbedarf. Kannst du mir den Code erklären? Vor allem, weil ich ne Exception bekomme

Code:
cannot find symbol
symbol  : method getRowHeight(javax.swing.JTextArea)

Ich schätz einfach mal, das es so heißt:

Code:
int line = y/text.getRowHeight();

Aber dann bekomme ich die Meldung:

Code:
getRowHeight() has protected access in javax.swing.JTextArea

hab noch nie was mit protected gemacht, bzw. gebraucht. Von daher bin ich hier ziemlich aufgeschmissen
 
achso hnm das sind andre methoden in der gleichen utility klasse...
 
funtkinoiert denn die andre lösung? wenn ja dann ni8mm die doch dann 😉
 
weil das nur ein simples Tool ist, und ich es auch in der Programmierung ziemlich simpel gestalten wollte.
 
Das ist mir auch klar, es soll aber für nen Kumpel sein, der sich das mal anschauen wollt, und der checkt gar nichts :wink: . Naja, wird er halt net drum rum kommen :bae: . Thx @ all
 
Übrigens, es geht auch als Einzeiler 😀
Code:
System.out.println((editor.getCaretPosition()>=0)?1+((AbstractDocument)editor.getDocument()).getDefaultRootElement().getElementIndex(editor.getCaretPosition()):-1);
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben