RealHAZZARD
Erfahrenes Mitglied
Tach.
Ich habe mir da mal ein FormattedTextfield (jft) gebaut, einen
Eingabefilter(nur Zahlen) eingebaut und nen KeyListener
dran gehängt.
Der das tut:
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
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 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