# JTextArea, in welcher Zeile befindet sich der Cursor



## The_S (8. Apr 2005)

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.


----------



## The_S (8. Apr 2005)

Äh, ja ... LineListener war wohl ein bisschen falsch ... sollte mir das Zeug wohl auch mal durchlesen  . Mit was mach ich das dann?


----------



## semi (8. Apr 2005)

Versuche das hier. (hab's nicht ausprobiert)
	
	
	
	





```
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.


----------



## The_S (8. Apr 2005)

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:


----------



## semi (8. Apr 2005)

Läuft es überhaupt? War nur so ins Blaue geschossen, ohne es zu prüfen.


```
// 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)); 
}
```


----------



## The_S (8. Apr 2005)

Danke! kA obs läfft, habs noch net ausprobiert :bae:


----------



## thE_29 (8. Apr 2005)

JTextArea.getCaret().getMark() geht auch, schau was dir das zurückbringt!


----------



## The_S (8. Apr 2005)

thE_29 hat gesagt.:
			
		

> JTextArea.getCaret().getMark() geht auch, schau was dir das zurückbringt!



jup, das funzt! Und ist net ganz so kompliziert :wink: . Danke


----------



## The_S (8. Apr 2005)

Nö, tuts doch net ???:L . Gibt mir die Position des Cursors zurück! Hät ich vielleicht besser testen sollen :bae: . Jemand ne Idee?


----------



## thE_29 (8. Apr 2005)

Achso, du willst die Zeilenanzahl, tjo, das ist ne gute Frage


----------



## The_S (8. Apr 2005)

thE_29 hat gesagt.:
			
		

> Achso, du willst die Zeilenanzahl, tjo, das ist ne gute Frage



Nee, net die anzahl (das is ja leicht), ich möchte die aktuelle Zeile in der sich der Cursor befindet.


----------



## Roar (8. Apr 2005)

so:


```
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;
	}
```


----------



## Guest (8. Apr 2005)

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()


----------



## The_S (9. Apr 2005)

Roar hat gesagt.:
			
		

> ```
> public static int getCaretColumnPosition(JTextComponent comp) {
> int offset = comp.getCaretPosition();
> int column;
> ...



Das versteh ich.



			
				Roar hat gesagt.:
			
		

> ```
> public static int getCaretRowPosition(JTextComponent comp) {
> try {
> int y = comp.modelToView(comp.getCaretPosition()).y;
> ...



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


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

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


```
int line = y/text.getRowHeight();
```

Aber dann bekomme ich die Meldung:


```
getRowHeight() has protected access in javax.swing.JTextArea
```

hab noch nie was mit protected gemacht, bzw. gebraucht. Von daher bin ich hier ziemlich aufgeschmissen


----------



## Roar (9. Apr 2005)

achso hnm das sind andre methoden in der gleichen utility klasse...


----------



## The_S (9. Apr 2005)

Und das heißt jetzt für mich!?


----------



## Roar (9. Apr 2005)

funtkinoiert denn die andre lösung? wenn ja dann ni8mm die doch dann


----------



## The_S (9. Apr 2005)

Die von Gast!? Wollte eigentlich um document herrumkommen ...


----------



## Roar (9. Apr 2005)

ähhh warum das?


----------



## The_S (9. Apr 2005)

weil das nur ein simples Tool ist, und ich es auch in der Programmierung ziemlich simpel gestalten wollte.


----------



## semi (9. Apr 2005)

Einfacher wird's nicht mehr. Es ist ein Dreizeiler.


----------



## The_S (9. Apr 2005)

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


----------



## semi (9. Apr 2005)

Übrigens, es geht auch als Einzeiler 

```
System.out.println((editor.getCaretPosition()>=0)?1+((AbstractDocument)editor.getDocument()).getDefaultRootElement().getElementIndex(editor.getCaretPosition()):-1);
```


----------



## The_S (9. Apr 2005)

lol, ich glaub ich bevorzuge den Dreizeiler *G*.


----------



## Illuvatar (9. Apr 2005)

Kommt drauf an ob wie gern du besagten Kumpel magst


----------



## The_S (10. Apr 2005)

funzt einwandfrei!!! Danke!


----------

