Hallo, ich habe viel über dieses Thema gelesen aber alle Lösungen hatten extends bei der Klasse.
Ich arbeite aber momentan ohne Vererbung. Deswegen die Frage:
Ich möchte, dass ein TextFeld nur Zahlen annimmt. Ich habe erfahren, dass es durch KeyListener unsicher ist, da man es mit Copy&Paste wohl umgehen kann. Dann habe ich über JFormattedTextField
gelesen und MaskFormatter(). Das ist wahrscheinlich die Lösung, aber wie sieht der Code aus?
Mein Code schaut so aus:
JFormattedTextField PLZ = new JFormattedTextField(5); //eine Postleitzahl
MaskFormatter PLZ = new MaskFormatter("######");
PLZ.setBounds(x,y,z,d);
usw ...
Dann sagt er mir als Fehler: Unhandled exception type ParseException. Ich muss wohl ein
try und catch block hinzufügen, aber wie soll der ausschauen?
Und warum lernst du dann nicht mit Vererbung umzugehen ? Abgesehen davon erbt jede deiner Klasse von [c]java.lang.Object[/c], du hast immer eine Vererbung.
Das hatte ich nicht gemeint. Eher wie sich der try catch Block auf das Textfeld bezieht. Ich habe momentan diesen Pydocode im Kopf:
JFormattedTextField PLZ = new JFormattedTextField(5);
MastFormatter PLZ = new MastFormatter("#####");
if((PLZ.getInt())!=0){
try{
//keine Ahnung wie es in diesem Block ausschauen soll. Ich muss wohl den
Wert des Textfeldes nehmen und ihn in ein Integer versuchen zu verwandeln.
Falls es nicht klappt, wird der catch Block ausgeführt.
}
catch{
//Fehlermeldung, weil keine Zahl eingegeben
}
Ich hab in meiner Anwendung auch mehrere Fälle, wo in Textfeldern nur bestimmte Werte (nur Zahlen, nur Buchstaben...) eingegeben werden sollen. Ich hab das mit einem DocumentFilter gelöst. Da kann man mit einem Pattern bestimmen, was in das Textfeld rein darf. Zum Beispiel auch die Anzahl der Zeichen. Und das ganze funktioniert schon während der Texteingabe.
zur not nimmst du ein "normales" JTextField und setzt einfach ein eigenes PlainDocument ... in dem kannst du dann in insertString(int, String, AttributeSet) die eingabe auf gültigkeit prüfen ...
wenn ich das try und catch block weglasse sagt er mir "unhandled ParseException"..
try catch muss wohl da sein.
EDIT: Es ist doch so: Ich brauche einen Listener, der überprüft, falls sich der Wert des TextFields geändert hat. Wenn ja wird eine Funktion aufgerufen, die den Inhalt des Feldes in eine Zahl umwandelt(try/catch), falls es klappt, wurden ziffern eingetragen, falls nicht logischerweise ungültige zahlen.
also laut doc sollte dein code so stimmen ... aber einen listener brauchst du nicht ... der wird denke ich mal internet vom KeyListener der für die "eingabe" notwedig ist *sonst könntest du auf der tastatur rumhämmern aber es würde nie ein buchstabe auf dem screen erscheinen* gemacht ...
wie gesagt : leite dir was von PlainDocument ab und nutze ein normales JTextField dem du dann eine instanz deiner klasse übergibst ... geht meiner meinung nach genau so einfach als wenn du da mit nem Formatter rumspielst ... und es erfordert kein Exception-Handling
Damit funktioniert es. Ich bitte mal die Profis, einen Blick über diesen Codeschnipsel zu werfen und ihn zu verbessern, falls nötig. Zum Beispiel wird der catch Block nie ausgeführt. Man kann einfach keine Buchstaben eintippen. Man kann nicht mal mit STRG+V etwas einfügen. Rechtsklick geht auch nicht. Man kann lediglich Zahlen eintippen.
public MaskFormatter(String mask)
throws ParseException
Creates a MaskFormatter with the specified mask. A ParseException will be thrown if mask is an invalid mask.
Throws: ParseException - if mask does not contain valid mask characters
mal davon abgesehen das ein konstruktor auch nicht der ort sein wird wo ein fehler geworfen wird wenn eine falsch eingabe kommt ist das auch garnicht der grund für diese exception ...
diese exception wird vom konstruktor von MaskFormatter geworfen wenn du ihm eine ungültige Mask übergibst *wird intern bestimmt mit RegEx gemacht* ...
wenn du eine fehler-meldung haben willst wenn jemand versucht etwas ungültiges umzusetzen wirst du um ein Document *oder zumidnest einen entsprechenden Listener* nicht herum kommen ... da der MaskFormatter nichts anderes macht ... du allerdings dort keinen eingriff hast ...
ps : rechtsklick auf eine JComponent -> kontextmenü ? ... wäre mir neu ... zumindest gibt es sowas nicht ohne das man es programmiert hat ... außer vllt JTextField/JTextArea als standard-impl des OS *normales kontext-menü bei text-componenten halt* ...
So, mit regulären Ausdrücken ist es mir gelungen, nur Zahlen, beziehungsweise nur Buchstaben anzunehmen. Auch wenn mit Copy & Paste etwas eingefügt wird. Nun ist es aber so, dass nach dem Formatieren ein rechtsklick auf das Textfeld kein Menü erscheinen lässt. Wie kann ich es wieder einschalten?