JTextField und Courso-Position

Hi,

ich mehre gerade an einem JTextField rum und will z.B. verhindern, daß einer Buchstaben eingibt, obwohl nur Zahlen zugelassen sind.

Theoretisch kann ich ja dies mit einem KeyListener machen.

Jetzt will ich aber genau das letzte eingegebene Zeichen löschen, auch wenn es mittendrin eingegeben wurde, also muß ich die Coursor-Position ermitteln.

Geht das irgendwie?

Besten Dank

Winni

Hi.

Wenn du anstelle des JTextField ein JFormattedTextField nimmst, kannst du festlegen, dass nur zahlen eingegeben werden können (mittels eines NumberFormatter, den du dem Konstruktor übergibst). Zwar kann man weiterhin Buchstaben in das Eingabefeld schreiben, aber das Textfeld verlassen kann man erst bei einer korrekten Eingabe.

Sebastian.

Hi,

verwende hierzu am Besten kein JTextField sondern einen JSpinner.
Ansonsten kannst du ein eigenes Document erstellen, welches nur Zahlen akzeptiert. Ein ähnliches Beispiel dafür steht direkt in der API-Doku von JTextField.

Ciao, Bill

Hi,

danke für den Tipp, habe bei Java ist eine Insel auch gleich was Passendes gefunden.
Jetzt habe ich aber noch das Problem, daß ich ja das Komma in den Punkt und eine Bereichsprüfung machen muß.
(sollte ich dafür zwischendurch einen KeyListener einbauen?)

Und wird beim Verlassen noch ein Event generiert, damit ich einen weiteren Listener ansteuern könnte?

Besten Dank

Winni

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi.

Wenn du als NumberFormatter folgendes dem Konstruktor des JFormattedTextField übergibst, wird das Default-Trennzeichen deines Systems genommen:
NumberFormat.getNumberInstance();
Die Zeile sieht dann also so aus:

JFormattedTextField asdf = new JFormattedTextField(NumberFormat.getNumberInstance());

Wenn das nicht geht, musst du vorher per Locale.setDefault(Locale.GERMAN) ein Deutsches Locale auswählen, womit dann das richtige Trennzeichen gesetzt werden sollte.

Sebastian.

Hi,

ich habe das mit dem Format schon hinbekommen, aber nun will ich halt überprüfen, ob die Zahl vielleicht zu groß ist.

Daher wäre es hilfreich zu wissen, ob und wenn ja Welches Event erzeugt wird, wenn das Feld verlassen wird.

Besten Dank aber trotzdem…

Winni

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi.

Das kann ebenfalls der NumberFormatter. Da gibt es 2 Methoden: setMinimum und setMaximum. Beide benötigen einen Parameter vom Typ Comparable. Dies ist ein Interface, welches z.B. von den Klassen Integer oder Double implementiert wird. Objekte dieser Typen können da also übergeben werden. Damit solltest du eigentlich das gewünschte hinbekommen.

Wenn du doch die Events brauchst:
Beim Verlassen des Feldes wird ein FocusEvent ausgelöst. Wenn der Benutzer auf Enter drückt, um die Eingabe zu übernehmen, wird ein ActionEvent ausgelöst.

Sebastian.

Hi,

dankesehr erstmal hierfür.
Ich bin gerade dabei, das umzusetzen.

Nun noch ein paar kleine Fragen:
Wenn ich kein Format übergebe, verhält sich dann das Teil wie ein normales JTextField?
Kann ich im Nachhinein noch das Format festlegen?
Wie kann ich denn das Format für Integerzahlen festlegen?

Dankesehr

Winni

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi.

Nun noch ein paar kleine Fragen:
Wenn ich kein Format übergebe, verhält sich dann das Teil wie
ein normales JTextField?

Das weiss ich leider auch nicht. Musst du einfach mal ausprobieren.

Kann ich im Nachhinein noch das Format festlegen?

Ja. Da gibt es eine Methode setFormatterFactory. Die bekommt allerdings nicht direkt ein Formatter-Objekt übergeben, sondern ein AbstractFormatterFactory-Objekt. Die Klasse ist abstract, du musst davon erben und da dann eine Methode getFormatter implementieren, die ein JFormattedTextField als Parameter übergeben bekommt und dann den Formatter zurückgibt.

Wie kann ich denn das Format für Integerzahlen festlegen?

Wenn es einfach eine beliebige Integerzahl sein soll und schon beim Erstellen des TextFields festgelegt werden soll:
new JFormattedTextField(new NumberFormatter(NumberFormat.getIntegerInstance()));

Sebastian.

Hi,

(hat ne Weile gedauert, weil ich etwas anderes noch schaffen mußte)

Hi.

Nun noch ein paar kleine Fragen:
Wenn ich kein Format übergebe, verhält sich dann das Teil wie
ein normales JTextField?

Das weiss ich leider auch nicht. Musst du einfach mal
ausprobieren.

Kann ich im Nachhinein noch das Format festlegen?

Ja. Da gibt es eine Methode setFormatterFactory. Die bekommt
allerdings nicht direkt ein Formatter-Objekt übergeben,
sondern ein AbstractFormatterFactory-Objekt. Die Klasse ist
abstract, du musst davon erben und da dann eine Methode
getFormatter implementieren, die ein JFormattedTextField als
Parameter übergeben bekommt und dann den Formatter zurückgibt.

Hast Du irgendwo ne Doku wie das genau geht?
Ich habe bisher nix brauchbares gefunden.

Ich will halt ne Klasse von JFormattedTextField ableiten, und dann den Konstruktor mit ein paar Parametern aufrufen, den Konstruktor der Superclass muß ich aber Parameterlos aufrufen und den Rest halt danach mittels der Methoden einstellen. (erst nach ein paar Anweisungen kann ich die entsprechenden Formate festlegen)

Wie kann ich denn das Format für Integerzahlen festlegen?

Wenn es einfach eine beliebige Integerzahl sein soll und schon
beim Erstellen des TextFields festgelegt werden soll:
new JFormattedTextField(new
NumberFormatter(NumberFormat.getIntegerInstance()));

Sebastian.

THX

Winni

Hi,

Ja. Da gibt es eine Methode setFormatterFactory. Die bekommt
allerdings nicht direkt ein Formatter-Objekt übergeben,
sondern ein AbstractFormatterFactory-Objekt. Die Klasse ist
abstract, du musst davon erben und da dann eine Methode
getFormatter implementieren, die ein JFormattedTextField als
Parameter übergeben bekommt und dann den Formatter zurückgibt.

Hast Du irgendwo ne Doku wie das genau geht?
Ich habe bisher nix brauchbares gefunden.

Nur die normale Java-API-Doku. Die gibt es hier: http://java.sun.com/j2se/1.4.2/docs/api/

Ich will halt ne Klasse von JFormattedTextField ableiten, und
dann den Konstruktor mit ein paar Parametern aufrufen, den
Konstruktor der Superclass muß ich aber Parameterlos aufrufen
und den Rest halt danach mittels der Methoden einstellen.
(erst nach ein paar Anweisungen kann ich die entsprechenden
Formate festlegen)

Wenn du aus einer abgeleiteten Klasse das Format festlegen willst, gibt es auch eine Methode setFormatter, das dürfte etwas einfacher sein als das mit der FormatterFactory, denke ich. Lies dir in der Doku einfach mal die Erklärungen zu den entsprechenden Klassen und Methoden durch. Wenn du dann noch weitere Fragen hast, melde dich einfach nochmal.

Sebastian.

Hi :smile:)

Ich will halt ne Klasse von JFormattedTextField ableiten, und
dann den Konstruktor mit ein paar Parametern aufrufen, den
Konstruktor der Superclass muß ich aber Parameterlos aufrufen
und den Rest halt danach mittels der Methoden einstellen.
(erst nach ein paar Anweisungen kann ich die entsprechenden
Formate festlegen)

Wenn du aus einer abgeleiteten Klasse das Format festlegen
willst, gibt es auch eine Methode setFormatter, das dürfte
etwas einfacher sein als das mit der FormatterFactory, denke
ich. Lies dir in der Doku einfach mal die Erklärungen zu den
entsprechenden Klassen und Methoden durch. Wenn du dann noch
weitere Fragen hast, melde dich einfach nochmal.

Ich habe eine Abgeleitete Klasse und im Konstuktor, bzw. der init-Methode geschrieben:

NumberFormatter nf = new NumberFormatter(new DecimalFormat("0.000"));
this.setFormatter(nf);
this.addKeyListener(new DecimalKeyAdapter()); //wandelt ein ',' in '.'
this.setText(str);

Der String str beinhaltet schon die richtig formatierte Zahl.

Nur wird die Zahl bei Focus_lost (wenn ich rausgehe) nicht nach den Vorgaben überprüft.

Eine Idee, wo ich ansetzen sollte?

Winni

Hi.

Ich habe eine Abgeleitete Klasse und im Konstuktor, bzw. der
init-Methode geschrieben:

NumberFormatter nf = new NumberFormatter(new
DecimalFormat(„0.000“));
this.setFormatter(nf);
this.addKeyListener(new DecimalKeyAdapter()); //wandelt ein
‚,‘ in ‚.‘
this.setText(str);

Der String str beinhaltet schon die richtig formatierte Zahl.

Probier mal „this.setValue()“ statt „this.setText()“. Eventuell klappt es damit.

Nur wird die Zahl bei Focus_lost (wenn ich rausgehe) nicht
nach den Vorgaben überprüft.

Eventuell musst du per setFocusLostBehavior(…) erst einstellen, dass da geprüft werden soll. Wenn im Konstruktor ein Format mit angegeben wird, ist das defaultmäßig so, keine Ahnung, was der Konstruktor ohne Parameter da als Wert reinschreibt.

Sebastian.

Hi,

vielleicht hast Du eine Idee?

Gruß

Winni