# KeyEvent Leerzeichen und Backspace funktioren nicht! HILFE!



## harry (29. Nov 2005)

Hallo!

ich habe eine Klasse, die von JTextArea abgeleitet ist. 

```
class MyJTextArea extends JTextArea {   
   public MyJTextArea() {
   }   
   
   public void processKeyEvent(KeyEvent e) {

       if ((e.getKeyCode() == KeyEvent.VK_SPACE) ||
                      (e.getKeyCode() == KeyEvent.VK_BACK_SPACE))  {
          super.processKeyEvent(e);
          System.out.println("Backspace oder Leertaste");
           }
       
   }   
}
```


Einrückung ist etwas blöd, aber ich mußte das Beispiel etwas anpassen.

Also das Problem ist:
Wenn ich Leertaste oder Backspace drücke erkennt er das auch anhand des Kexcodes und gibt auf den String "Backspace oder Leertaste" aber er GIBT es eben nicht mit seiner super-MEthode weiter.
Bei e.getKeyCode()== KeyEvent.VK_SHIFT geht das ohne Probleme!


Wenn ich den KeyListener nutze , oder direkt super.processKeyEvent(e); aufrufe kann ich nicht nicht mehr bestimmen, wann das Zeichen ausgegeben werden soll und wann nicht. Ich will nämlich nur gewisse Zeichen und eben Leertaste und BAckspace zulassen.

Die Alternative wäre dann nur einen Keylistener zu nutzen und dann eben auf die TextArea draufzugreifen und daraus dann zeichen löschen, die weg sollen. Aber ist nicht elegant.



Ich weiß nicht mehr weiter!
Bitte helft mir!

Vielen Dank im Voraus!

Gruß


----------



## André Uhres (30. Nov 2005)

```
/*
 * TextCheck.java
 */
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
public class TextCheck extends JFrame {
    public TextCheck() {
        super("Nur kleine Buchstaben ohne Umlaut");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400,300);
        setLocationRelativeTo(null);
        textArea = new JTextArea();
        textArea.setDocument(new MyTextDocument());
        getContentPane().add(textArea, BorderLayout.CENTER);
    }
    public static void main(final String args[]){new TextCheck().setVisible(true);}
    private JTextArea textArea;
}
class MyTextDocument extends DefaultStyledDocument {
    public void insertString(final int offs, final String str, final AttributeSet a)
    throws BadLocationException {
        char[] strA = str.toCharArray();
        for (int i = strA.length-1; i > -1; i--) {
            if ( valid.indexOf(strA[i]) > -1)
                super.insertString(offs, ""+strA[i], a);
            else
                Toolkit.getDefaultToolkit().beep();
        }
    }
    private final String valid = "abcdefghijklmnopqrstuvwyxz"
            +" \t\n";     //space, tab, newline 
}
```


----------



## harry (30. Nov 2005)

vielen Dank, Andre!

Auf die Idee bin ich noch nicht gekommen, nur Zeichen einzutragen und den Rest zulassen.

Die letzten Lösungsmöglichkeiten waren nur noch selbst zu programmieren. Hatte auch funktioniert, aber außer den zulgeassenen Operationen ist da ja nichts möglich (kein Strg+C , Strg+V usw.)

Dein Code ist da eleganter!

Hier das zu Fuß programmierte ....

```
//Backspace
		                        boolean downLeerTaste = true;
		                        boolean downBackSpace = true;
                                        .....
					if (e.getKeyCode() == KeyEvent.VK_BACK_SPACE) {
		 				//jedes zweite Event abfangen und nur asuführen, wenn position>0 ist, sonst Fehler
		 				//also Position des Cursors
		 				if (!downBackSpace && (getCaretPosition()>0)) {	 					
		 		 			    replaceRange("",getCaretPosition()-1,getCaretPosition());
		 		 		}
		 				downBackSpace = !downBackSpace;	 				
					}
//  Leerzeichen
 			                if (e.getKeyCode() == KeyEvent.VK_SPACE && leerZeichenerlaubt) {
						    if (!downLeerTaste) {
								insert(" ",getCaretPosition());
						    }
						    downLeerTaste = !downLeerTaste;							
						}
```


----------

