Eingabefeld lässt sich verarschen :-)

RealHAZZARD

Erfahrenes Mitglied
Tach.

Ich habe mir da mal ein FormattedTextfield (jft) gebaut, einen
Eingabefilter(nur Zahlen) eingebaut und nen KeyListener
dran gehängt.

Code:
  jft.addKeyListener(new KeyListener()
  			  {
 				 public void keyTyped (KeyEvent ke){}
  				  
 				 public void keyPressed (KeyEvent ke){}
 				 public void keyReleased (KeyEvent ke)
  				  {
 			 		if (Character.isDigit(ke.getKeyChar()))LookatChanges(ke.getKeyChar());
  				  }
  			  });

Der das tut:
Code:
  public void LookatChanges(char key)
  	{
  		/**
 		 * TODO Numpad noch einbauen, ist bisher nur für Tasten vom alphanumerischen Block
  		 */
  		//Wenn der Cursor auf Posi 1 ist
  		if (jft.getCaretPosition()==1)
  		{
  			//Wenn die Eingabe weder 0 noch 1 noch 2 noch 3 ist
 			if (!(key==KeyEvent.VK_3||key==KeyEvent.VK_2||key==KeyEvent.VK_1||key==KeyEvent.VK_NUMPAD0||key==KeyEvent.VK_NUMPAD3||key==KeyEvent.VK_NUMPAD2||key==KeyEvent.VK_NUMPAD1||key==KeyEvent.VK_NUMPAD0))
  			{	
 		 		dateFormat.setAllowsInvalid(true);
  		    	    jft.setText("_"+jft.getText().substring(1));
 					jft.setCaretPosition(0);
  		    	    dateFormat.setAllowsInvalid(false);
  				
  			} 
 			//Wenn die 3 gedrückt wurde und an zweiter Stelle der Tagesangabe eine Zahle größer 1 steht
 			else if((key==KeyEvent.VK_3||key==KeyEvent.VK_NUMPAD3)&&Integer.parseInt(jft.getText().substring(1,2))>1)
  			{
 				dateFormat.setAllowsInvalid(true);
 				jft.setText("_"+jft.getText().substring(1));
  				jft.setCaretPosition(0);
 				dateFormat.setAllowsInvalid(false);
  			}
  		}
  		//Wenn der Cursor auf Posi 2 ist 
 		else if (jft.getCaretPosition()==3&&jft.getText().substring(0,1).equals("3")&&!(key==KeyEvent.VK_0||key==KeyEvent.VK_1||key==KeyEvent.VK_NUMPAD0||key==KeyEvent.VK_NUMPAD1))
  		{
  			dateFormat.setAllowsInvalid(true);
  		    jft.setText(jft.getText().substring(0,1)+"_"+jft.getText().substring(2));
  			jft.setCaretPosition(1);
  			dateFormat.setAllowsInvalid(false);
  		}
  		//Wenn der Cursor auf Posi 4 ist 
  		if (jft.getCaretPosition()==4)
  		{
  			//Wenn die Eingabe weder 0 noch 1 ist
 			if (!(key==KeyEvent.VK_1||key==KeyEvent.VK_0||key==KeyEvent.VK_NUMPAD0||key==KeyEvent.VK_NUMPAD1))
  			{	
 		 		dateFormat.setAllowsInvalid(true);
 		 	 jft.setText(jft.getText().substring(0,3)+"_"+jft.getText().substring(4));
 					jft.setCaretPosition(3);
  		    	    dateFormat.setAllowsInvalid(false);
  				
  			} 
 			//Wenn die 3 gedrückt wurde und an zweiter Stelle der Tagesangabe eine Zahle größer 1 steht
 			else if((key==KeyEvent.VK_1||key==KeyEvent.VK_NUMPAD1)&&Integer.parseInt(jft.getText().substring(4,5))>2)
  			{
 				dateFormat.setAllowsInvalid(true);
 		 jft.setText(jft.getText().substring(0,3)+"_"+jft.getText().substring(4));
  				jft.setCaretPosition(3);
 				dateFormat.setAllowsInvalid(false);
  			}
  		}	
  		//Wenn der Cursor auf Posi 5 ist 
 		else if (jft.getCaretPosition()==6&&jft.getText().substring(3,4).equals("1")&&!(key==KeyEvent.VK_0||key==KeyEvent.VK_1||key==KeyEvent.VK_2||key==KeyEvent.VK_NUMPAD0||key==KeyEvent.VK_NUMPAD1||key==KeyEvent.VK_NUMPAD2))
  		{
  			dateFormat.setAllowsInvalid(true);
  		    jft.setText(jft.getText().substring(0,4)+"_"+jft.getText().substring(5));
  			jft.setCaretPosition(4);
  			dateFormat.setAllowsInvalid(false);
  		}
  		//Wenn der Cursor auf Posi 5 ist 
 		else if (jft.getCaretPosition()==7&&!(key==KeyEvent.VK_1||key==KeyEvent.VK_2||key==KeyEvent.VK_NUMPAD1||key==KeyEvent.VK_NUMPAD2))
  		{
  			dateFormat.setAllowsInvalid(true);
  		    jft.setText(jft.getText().substring(0,6)+"_"+jft.getText().substring(7));
  			jft.setCaretPosition(6);
  			dateFormat.setAllowsInvalid(false);
  		}
  	}
Das tut er auch soweit ich das getestet hab. Das ist auch nicht mein Problem.
Das Problem liegt eher bei schnellen Usern oder wildem Tippen. Denn dann kann
man den Mechanismus überlsiten.
Daher meine Fragen:
Ist mein Code zu langsam?
Oder habe ich denn falschen Ansatz zur Lösung?
Oder gibt es vielleicht etwas das ich dem FormattedTextField
übergeben kann, dass das alles gleich Performance-schonender
(schneller) macht, ohne dass man gleich sämtliche Tasten die
relevant sind auffangen und verarbeiten muss?

Mein Ziel ist ein Eingabefeld wie bei der Suche von XP:
(windowstaste+F drücken,
"Dateien und Ordner suchen" wählen,
"wann wurde die Datei geändert" wählen,
Und dann seht ihr die eingabefelder schon.)

Die machen das ja auch irgendwie anders. Die arbeiten wohl mit der
Markierung...
Hat jemand Ahnung, wie ich das besser hinbekomme, oder wie es geich
besser geht?

THX
 
Ohne jetzt groß in den Code eingestiegen zu sein .. Kann man da vielleicht die neue Queue Klasse nutzen? Und dann wird halt alles erstmal in die Queue reingeworfen und nacheinander abgearbeitet. Da reicht dann wahrscheinlich die Verarbeitungsgeschwindigkeit aus .. denke ich mal ..
 
Zurück