In Textfeld Kommazahl anzeigen aber ohne Komma eingeben

forrest

Mitglied
Hallo zusammen,

ich versuche gerade ein Problem zu lösen, dass folgendermaßen aussieht:
Ich muss in einer Oberflöche viele Zahlen nacheinander eingeben, die immer gleich formatiert sind: ein oder zwie Vorkommazahlen und eine Nachkommazahl. Damit ich die Eingabe einfacher gestalten kann möchte ich gerne die Zahl ohne Komma eingeben. Das Textfeld soll allerdings direkt die Zahl korrekt formatieren. Bei einer Eingabe von 78 soll also direkt 7,8 angezeigt werden. Ich komme hier leider nicht weiter. Kann mir dabei jemand helfen?

Danke,

Forrest
 

EdelStoff

Mitglied
Du könntest dem TextField einen KeyListener hinzufügen und darin dann etwas in diese Richtung machen:
Java:
private void jTextFieldKeyReleased(KeyEvent evt) {
		String text = jTextField.getText();
		text = text.replaceAll(",", "");
		jTextField.setText(text.substring(0, text.length() - 1) + ","
				+ text.substring(text.length() - 1));
}

geht mit sicherheit noch schöner, aber etwas besseres ist mir auf die schnelle nicht eingefallen.
 

forrest

Mitglied
Das scheint zu funktionieren. Danke Dir!
Wenn es tatsächlich noch eine schönere Variante geben sollte, wäre ich auch nicht abgeneigt :)
 

forrest

Mitglied
Das habe ich auch ausprobiert, allerdings muss man dabei immer das Trennzeichen miteingeben. Jedenfalls habe ich keinen Weg gefunden, wie man das umgehen kann.
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
Du könntest dem TextField einen KeyListener hinzufügen und [...]
Key Listener ist hier ungünstig. Zum Beispiel kann ich ja als Benutzer auch über die Maus Daten in das Textfeld kopieren. Ein Key Listener schlägt dann nicht an. Aber die selbe Lösung lässt sich sicher auch über einen DocumentListener realisieren...

Das habe ich auch ausprobiert, allerdings muss man dabei immer das Trennzeichen miteingeben. Jedenfalls habe ich keinen Weg gefunden, wie man das umgehen kann.
Indem man einen eigenen Formatter implementiert und diesen dem JFormattedTextField übergibt.

Ebenius
 

Ebenius

Top Contributor
Indem man einen eigenen Formatter implementiert und diesen dem JFormattedTextField übergibt.
Man muss die Formatter nicht mal selber implementieren. Hier mal ein Beispiel:
Java:
/* (@)FormattedTextFieldTestGui.java */

/* Copyright 2010 Sebastian Haufe

 * Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

 * Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

package com.ebenius;

import java.awt.BorderLayout;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.text.DecimalFormat;

import javax.swing.*;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.NumberFormatter;

/**
 * Sample code for formatted text fields with separate display and edit
 * formatters.
 * 
 * @version $Revision$ as of $Date$
 * @author Sebastian Haufe
 * @since Playground-3.8
 */
public class FormattedTextFieldTestGui {

  /** Creates the GUI. Call on EDT, only! */
  static void createAndShowGui() {
    /* create custom number formats */
    final DecimalFormat displayFmt = new DecimalFormat("#.00");
    final DecimalFormat editFmt = new DecimalFormat("#.##");

    /* create custom formatters */
    final NumberFormatter editFormatter = new NumberFormatter(editFmt);
    final NumberFormatter displayFormatter = new NumberFormatter(displayFmt);

    /* create formatted text field with my formatters */
    final JFormattedTextField ftf = new JFormattedTextField();
    ftf.setFormatterFactory(new DefaultFormatterFactory(displayFormatter,
          displayFormatter, editFormatter));

    /* select all on focus gained */
    ftf.addFocusListener(new FocusAdapter() {

      @Override
      public void focusGained(final FocusEvent e) {
        SwingUtilities.invokeLater(new Runnable() {

          public void run() {
            ((JFormattedTextField) e.getComponent()).selectAll();
          }
        });
      }
    });

    /* create and show test frame */
    final JPanel contentPane = new JPanel(new BorderLayout(6, 6));
    contentPane.add(ftf);
    contentPane.add(new JButton("Dummy"), BorderLayout.SOUTH);

    final JFrame f = new JFrame("Test Frame: FormattedTextFieldTestGui");
    f.setContentPane(contentPane);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
  }

  /** @param args ignored */
  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

      public void run() {
        createAndShowGui();
      }
    });
  }
}
Ebenius
 

forrest

Mitglied
Hallo Ebenius,

mit Deinem Code kann man allerdings auch nicht etwa eine 75 eingeben und direkt eine 7,5 ausgeben lassen. Mit dem Formatter wird am Ende nur eine Dezimalzahl mit angehängten Nullen (75,00) dargestellt. Das ist ja nicht das, was ich haben möchte.

Grüße,
Forrest
 
G

Gast2

Gast
Dann schreib dir ein eigener NumberFormatter....
Java:
		NumberFormatter numberFormatter = new NumberFormatter(){
			@Override
			public String valueToString(Object value) throws ParseException {
				// TODO Auto-generated method stub
				return super.valueToString(value);
			}
			@Override
			public Object stringToValue(String text) throws ParseException {
				// TODO Auto-generated method stub
				return super.stringToValue(text);
			}
		};
 
G

Gast2

Gast
Sowas hier... Ist auf die schnelle gemacht kannst ja deinen Bedürfnissen anpassen.

Java:
		DecimalFormat decimalFormat = new DecimalFormat();
		decimalFormat.setMaximumFractionDigits(2);
		NumberFormatter numberFormatter = new NumberFormatter(decimalFormat){
			@Override
			public String valueToString(Object value) throws ParseException {
				if(!getAllowsInvalid() && value != null){
					
					Number number = (Number) value;
					if(number.doubleValue() > 10){
						value = Double.valueOf(number.doubleValue() / 10);
					}
				}
				return super.valueToString(value);
			}
			@Override
			public Object stringToValue(String text) throws ParseException {
				if(text.isEmpty()){
					return null;
				}
				return super.stringToValue(text);
			}
		};
		numberFormatter.setAllowsInvalid(false);
 

Ebenius

Top Contributor
mit Deinem Code kann man allerdings auch nicht etwa eine 75 eingeben und direkt eine 7,5 ausgeben lassen.
Da liest man's schon zweimal und versteht die Anforderung trotzdem noch falsch. :-D

Na wenigstens hab ich mal gezeigt, wie die Formatter mit dem JFormattedTextField zusammen hängen, der Rest ist ja schnell selber implementiert.

Ebenius
 

Ebenius

Top Contributor
Hier mal ein Beispiel basierend auf meinem obigen:
Java:
/* (@)FormattedTextFieldTestGui.java */

/* Copyright 2010 Sebastian Haufe

 * Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

 * Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

package com.ebenius;

import java.awt.BorderLayout;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParseException;

import javax.swing.*;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.NumberFormatter;

/**
 * Sample code for formatted text fields with separate display and edit
 * formatters.
 * 
 * @version $Revision$ as of $Date$
 * @author Sebastian Haufe
 * @since Playground-3.8
 */
public class FormattedTextFieldTestGui {

  /** Creates the GUI. Call on EDT, only! */
  static void createAndShowGui() {
    /* create custom number formats */
    final DecimalFormat format = new DecimalFormat("#.0");

    /* create custom formatters */
    final NumberFormatter formatter = new NumberFormatter(format) {

      /** Serial version UID */
      private static final long serialVersionUID = 1L;

      @Override
      public Object stringToValue(String text) throws ParseException {
        final DecimalFormat df = (DecimalFormat) getFormat();
        final DecimalFormatSymbols symbols = df.getDecimalFormatSymbols();
        final char decimalSeparator = symbols.getDecimalSeparator();

        /* insert decimal separator if not contained in text */
        if (text.indexOf(decimalSeparator) == -1 && text.length() > 0) {
          text = text.replaceFirst("\\d$", decimalSeparator + "$0");
        }
        return super.stringToValue(text);
      }
    };

    /* create formatted text field with my formatters */
    final JFormattedTextField ftf = new JFormattedTextField();
    ftf.setFormatterFactory(new DefaultFormatterFactory(formatter));

    /* select all on focus gained */
    ftf.addFocusListener(new FocusAdapter() {

      @Override
      public void focusGained(final FocusEvent e) {
        SwingUtilities.invokeLater(new Runnable() {

          public void run() {
            ((JFormattedTextField) e.getComponent()).selectAll();
          }
        });
      }
    });

    /* create and show test frame */
    final JPanel contentPane = new JPanel(new BorderLayout(6, 6));
    contentPane.add(ftf);
    contentPane.add(new JButton("Dummy"), BorderLayout.SOUTH);

    final JFrame f = new JFrame("Test Frame: FormattedTextFieldTestGui");
    f.setContentPane(contentPane);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
  }

  /** @param args ignored */
  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

      public void run() {
        createAndShowGui();
      }
    });
  }
}
Ebenius
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Button und Textfeld Darstellung AWT, Swing, JavaFX & SWT 3
B Scene Builder Textfeld Begrenzen AWT, Swing, JavaFX & SWT 3
T JavaFX MultiLine / MultiStyle Textfeld AWT, Swing, JavaFX & SWT 1
izoards Textfeld für Zeit AWT, Swing, JavaFX & SWT 4
E Frage zum Textfeld AWT, Swing, JavaFX & SWT 8
B Ausgaben einer Umrechnung vom Textfeld in ein Label AWT, Swing, JavaFX & SWT 2
Z Swing Wert aus Textfeld auslesen -- null Fehler AWT, Swing, JavaFX & SWT 4
J SWT Textfeld markieren und kopieren AWT, Swing, JavaFX & SWT 0
A Swing nur Zahlen im Spinner(Textfeld) eingeben ! AWT, Swing, JavaFX & SWT 16
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
karlmasutra JavaFX Verzeichnispfad wählen und an Textfeld übergeben AWT, Swing, JavaFX & SWT 2
J Text in ein Textfeld eingeben und speichern AWT, Swing, JavaFX & SWT 27
cool_brivk24 Großes Textfeld AWT, Swing, JavaFX & SWT 8
J Textfeld nicht sichtbar AWT, Swing, JavaFX & SWT 2
P Knopf gedrückt -> Textfeld befüllen AWT, Swing, JavaFX & SWT 9
P Variable einer Eingabe in anderes Textfeld schreiben AWT, Swing, JavaFX & SWT 7
T [Neuling] Textfeld Inhalt überprüfen und falsche Stellen als msg Ausgeben AWT, Swing, JavaFX & SWT 1
V Swing Eingabe aus Textfeld abholen AWT, Swing, JavaFX & SWT 6
K Swing Textfeld verstecken aber benutzen AWT, Swing, JavaFX & SWT 15
J Swing Strings werden nicht in Textfeld geschrieben AWT, Swing, JavaFX & SWT 8
P Anfängerproblem mit Textfeld AWT, Swing, JavaFX & SWT 6
C Textfeld und Label werden nicht angezeigt (Ubuntu) AWT, Swing, JavaFX & SWT 2
F Textfeld Währungszahlen und automatische Aktualisierung AWT, Swing, JavaFX & SWT 14
R AWT AWT Textfeld durch Klick auf Button erstellen? AWT, Swing, JavaFX & SWT 3
D JavaFX Textfeld Eingabe validieren AWT, Swing, JavaFX & SWT 5
W Swing Nicht-Editierbares Textfeld in Panel in ScrollPane AWT, Swing, JavaFX & SWT 9
T SWT Button soll nur sichbar sein,wenn im Textfeld der Focus ist AWT, Swing, JavaFX & SWT 4
A Textfeld.append/.setText ohne Funktion AWT, Swing, JavaFX & SWT 2
G Text im textfeld in einem Editor anzeigen AWT, Swing, JavaFX & SWT 18
A Swing Zwei Klassen mit Textfeld Eingaben vergleichen und Ausgabe erzeugen AWT, Swing, JavaFX & SWT 10
N JavaFX Textfeld nur Zahlen und nur von 5 bis 30 AWT, Swing, JavaFX & SWT 11
D Eigenes Textfeld AWT, Swing, JavaFX & SWT 8
A combobox automatisch in ein textfeld wechseln AWT, Swing, JavaFX & SWT 3
D textfeld string zu float AWT, Swing, JavaFX & SWT 5
C TextFeld in Verbindung zur ComboBox automatisch aktualisieren AWT, Swing, JavaFX & SWT 7
C Swing Button in Textfeld (JFormattedTextField) AWT, Swing, JavaFX & SWT 7
A Textfeld nachträglich einfügen AWT, Swing, JavaFX & SWT 4
D JSlider und Textfeld AWT, Swing, JavaFX & SWT 2
E Textfeld auslesen AWT, Swing, JavaFX & SWT 2
G Swing Formatiertes Textfeld mit Trennzeichen AWT, Swing, JavaFX & SWT 2
T Swing URL übergabe aus einem Textfeld AWT, Swing, JavaFX & SWT 17
L SWT Textfeld AutoCompletion AWT, Swing, JavaFX & SWT 3
SexyPenny90 NumberFormatException Textfeld AWT, Swing, JavaFX & SWT 4
P SWT Toolbar mit nur einer Schaltfläche und einem Textfeld AWT, Swing, JavaFX & SWT 2
C Textfeld automatisch befüllen AWT, Swing, JavaFX & SWT 6
S Swing Textfeld Sonderzeichen Blockiern AWT, Swing, JavaFX & SWT 2
alex_fairytail Swing Textfeld Action wenn geschrieben wird? AWT, Swing, JavaFX & SWT 6
C SWT Textfeld mit festem und variablen Inhalt AWT, Swing, JavaFX & SWT 13
J Textfeld Rotation AWT, Swing, JavaFX & SWT 2
C Live Suche mit TextFeld AWT, Swing, JavaFX & SWT 2
maddin86 Eingabe in Textfeld 1 synchron in Textfeld 2 ausgeben AWT, Swing, JavaFX & SWT 9
R JDateChooser Datumseingabe via TextFeld wird verworfen AWT, Swing, JavaFX & SWT 8
W Daten auf Textfeld in anderer Klasse verwenden AWT, Swing, JavaFX & SWT 4
A aus einem Textfeld in double parsen AWT, Swing, JavaFX & SWT 10
A TextField: Textfeld teilweise editierbar AWT, Swing, JavaFX & SWT 2
1 Textfeld auslesen AWT, Swing, JavaFX & SWT 11
G Swing Komponente gesucht (Textfeld mit Liste) AWT, Swing, JavaFX & SWT 2
C SWT: Mehrere Formatter in einem Textfeld AWT, Swing, JavaFX & SWT 6
D Markierter Text in Textfeld AWT, Swing, JavaFX & SWT 3
L SWT Darstellung des Datums in Textfeld? AWT, Swing, JavaFX & SWT 2
M SWT Breite von Textfeld nur ohne Layout änderbar AWT, Swing, JavaFX & SWT 2
H Ausgabe an Textfeld JTextField AWT, Swing, JavaFX & SWT 3
D textfeld mit 0 bis n ziffern AWT, Swing, JavaFX & SWT 11
D SWT String aus Textfeld auslesen und in eine Tabelle speichern AWT, Swing, JavaFX & SWT 5
C Button/Textfeld mit Variable verknüpfen AWT, Swing, JavaFX & SWT 4
X Eingabe in Textfeld soll Button aktivieren... AWT, Swing, JavaFX & SWT 12
S SWT Bei Auslösen eines Buttones ein Textfeld generieren AWT, Swing, JavaFX & SWT 2
T SWT String mitten ins Textfeld einfügen + richtige Cursorposition AWT, Swing, JavaFX & SWT 3
N Textfeld füllen sobald es den Fokus verliert AWT, Swing, JavaFX & SWT 2
M SWT Wie Textfeld hinzufügen, nach Auswahl von einem bestimmten Combobox-item? AWT, Swing, JavaFX & SWT 3
M Bilder in einem Textfeld darstellen AWT, Swing, JavaFX & SWT 2
D Objekt (Map) in Textfeld ausgeben AWT, Swing, JavaFX & SWT 10
O Intwerte in Textfeld dastellen AWT, Swing, JavaFX & SWT 4
T Textfeld autmoatisch aktualisieren AWT, Swing, JavaFX & SWT 5
G CellEditor - Kein "Textfeld" AWT, Swing, JavaFX & SWT 6
O [SWT] Autocomplete bei Textfeld in PreferencePage AWT, Swing, JavaFX & SWT 2
G SWT - TextFeld automatisch aktualisieren AWT, Swing, JavaFX & SWT 15
M Prüfen, ob in einem Textfeld/Tabelle eine Eingabe erfolgt is AWT, Swing, JavaFX & SWT 11
F addSelectionListener für ein Textfeld AWT, Swing, JavaFX & SWT 10
K Textfeld wird nur jedes zweite Mal aktualisiert AWT, Swing, JavaFX & SWT 3
V Shortcuts nicht im Textfeld AWT, Swing, JavaFX & SWT 2
A Fokus in ein Textfeld setzen funktioniert nicht AWT, Swing, JavaFX & SWT 3
A Werte in ein Textfeld übernehmen AWT, Swing, JavaFX & SWT 4
A Fehler beim Auslesen aus einem Textfeld AWT, Swing, JavaFX & SWT 2
C Komme nicht an mein textfeld AWT, Swing, JavaFX & SWT 3
B Textfeld, Rollbaken: Eingabe klappt nicht AWT, Swing, JavaFX & SWT 2
P Textfeld einbinden AWT, Swing, JavaFX & SWT 4
P TextFeld Focus entfernen AWT, Swing, JavaFX & SWT 2
7 Zeilenumbruch in Textfeld AWT, Swing, JavaFX & SWT 3
S Textfeld soll auf Änderungen von nutzer und program reagiern AWT, Swing, JavaFX & SWT 3
G Datensätze aus DB in TextFeld ausgeben AWT, Swing, JavaFX & SWT 18
F Wie Oberfläche verbessern? (JButtons, Textfeld verkleinern) AWT, Swing, JavaFX & SWT 5
K Textfeld Programm soll auf Eingabe warten! AWT, Swing, JavaFX & SWT 4
M In Textfeld Textbereiche sperren? AWT, Swing, JavaFX & SWT 2
N SWT Textfeld und Verifylistener AWT, Swing, JavaFX & SWT 11
D Textfeld mit unterschiedlichen Formatierungen AWT, Swing, JavaFX & SWT 3
P SWT: Textfeld an Fenstergröße anpassen AWT, Swing, JavaFX & SWT 3
G Textfeld auslesen und auf der Konsole ausgeben? AWT, Swing, JavaFX & SWT 10
J AWT-Textfeld Aussehen ändern AWT, Swing, JavaFX & SWT 13
T Datum in Textfeld automatisch formatieren AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben