# Tab und KeyListener in einer JTextArea



## Micha_S (23. Mrz 2007)

Hallo!

Ich habe ein kleines Problem:

Ich habe an eine JTextArea eine KeyListener gehängt, der folgende Methode aufruft:

```
public void tasteGedrueckt(KeyEvent evt){

     if(evt.getKeyCode()==KeyEvent.VK_TAB){

       String txt=this.AliTar.getText();
       String adding="";
       int stelle=0;
       int actLine=this.AliTar.getLineCount()-1;

       try{
          stelle=this.AliTar.getLineEndOffset(actLine)-this.AliTar.getLineStartOffset(actLine);//wo bin ich innerhalb der Zeile?
       }catch(Exception x){}

       if(stelle<9){//Soll bis zur Stelle 9
          while((9 - stelle)>0){
             adding=adding+" ";
             stelle++;
          }
       }else if(stelle<16){//Soll bis zur Stelle 16
          while((16 - stelle)>0){
             adding=adding+" ";
             stelle++;
          }
       }
       this.AliTar.setText((txt+adding));
     }
  }
```

Die Methode soll immer wenn TAB gedrückt wird an eine bestimmte Stelle der JTextArea springen und die übersprungenen Zeichen mit Leerzeichen auffüllen.
Das funktioniert auch alles prima, nur wird anscheinend noch die normale Methode von TAB aufgerufen und der setzt mir ein Tab in die JTextArea. Ich habe schon versucht mit:

```
this.AliTar.setTabSize(0);
```
Das zu umgehen und es passt augenscheinlich auch, nur wenn ich dann den Text mit einer Schleife durchgeh und nach TABs suche findet er immer noch welche und das ist in mienem restlichen Programm schlecht, da ich nur Leerzeichen dazwischen haben will.

Hoffe jemand kann mir sagen wie man das austellen kann, dass die normale TAB methode aufgerufen wird, oder dass jemand eine andere Idee hat, wie man das lösen könnte.

Danke schon mal

Gruß
Micha


----------



## André Uhres (23. Mrz 2007)

```
package text;
/*
 * TextareaTabDemo.java
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TextareaTabDemo extends JFrame {
    private JTextArea textarea;
    public TextareaTabDemo() {
        super("Textarea Tab Demo");
        setSize(400,300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        textarea = new JTextArea();
        textarea.setColumns(20);
        textarea.setRows(5);
        getContentPane().add(new JScrollPane(textarea), BorderLayout.CENTER);
        InputMap im = textarea.getInputMap(JTextArea.WHEN_FOCUSED);
        //  Die Taste "Tab" ausblenden
        KeyStroke tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);
        im.put(tab, "none");
        textarea.addKeyListener(new KeyAdapter() {
            public void keyPressed(final KeyEvent e) {
                tasteGedrueckt(e);
            }
        });
    }
    public void tasteGedrueckt(final KeyEvent evt){
        if(evt.getKeyCode()==KeyEvent.VK_TAB){
            String txt=this.textarea.getText();
            String adding="";
            int stelle=0;
            int actLine=this.textarea.getLineCount()-1;
            try{
                stelle=this.textarea.getLineEndOffset(actLine)-this.textarea.getLineStartOffset(actLine);//wo bin ich innerhalb der Zeile?
            }catch(Exception x){}
            if(stelle<9){//Soll bis zur Stelle 9
                while((9 - stelle)>0){
                    adding=adding+" ";
                    stelle++;
                }
            }else if(stelle<16){//Soll bis zur Stelle 16
                while((16 - stelle)>0){
                    adding=adding+" ";
                    stelle++;
                }
            }
            this.textarea.setText((txt+adding));
        }
    }
    public static void main(final String args[]) {new TextareaTabDemo().setVisible(true);}
}
```


----------



## Guest (23. Mrz 2007)

Vielen Dank!
Das war genau das was ich brauchte!  

abgeharkt wird später...


----------



## Leroy42 (23. Mrz 2007)

Anonymous hat gesagt.:
			
		

> abgeharkt wird später...



Dann wünsch' ich dir als Gast viel Erfolg beim Abhaken dieses Treads


----------



## André Uhres (23. Mrz 2007)

Micha_S hat gesagt.:
			
		

> ..Das _war _genau das was ich brauchte!..


Keine Panik, es ist noch immer da


----------



## Micha_S (17. Apr 2007)

Danke nochmal!

Aber ich hab jetzt eine andere Sache, die ich gerne noch daran verändern würde...

Dieser Codeausschitt gehört zu einem Editor für eine ALI-Assembler und da ist es praktisch wenn man diese TAB sprünge einbaut.
Die funktionieren auch einwandfrei solange man nicht im Text zurückspringt und mittendrin im Code noch eine Zeile einfügen will.
Dann springt der Cursor nämlich wieder an das Ende des Codes zurück, da ich nur mit der aktuellen Zeile, also der letzten Zeile der Textarea arbeite.

Hat jemand eine Idee, wie ich die Zeile herausfinden kann in der der Cursor steht hab schon versucht irgendwas mit 

```
JTextArea.getCaretPosition()
```
aber da bekommt man ja nur die Zeichenposition an der der Cursor steht...

Danke schon mal!

Gruß
Micha


----------



## André Uhres (17. Apr 2007)

Ein Blick in die API hilft: http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JTextArea.html#getLineOfOffset(int)


----------



## Micha_S (17. Apr 2007)

DANKE!
Da hätte ich auch selber drauf kommen können... :?


----------

