JFormattedTextField nachkommastellen beim verlassen prüfen

Status
Nicht offen für weitere Antworten.

MScalli

Bekanntes Mitglied
Hi leutz.
Ich habe ein JFormattedTextField..

Code:
		tf_umrechnungsfaktor = new JFormattedTextField();
		tf_umrechnungsfaktor.setDocument(new DecimalDocument(10));
		tf_umrechnungsfaktor.setFont(MyParam.getTextFieldFont());
		tf_umrechnungsfaktor.setBounds(130, 110, 80, 25);
		tf_umrechnungsfaktor.setHorizontalAlignment(javax.swing.JTextField.RIGHT); 
	    pan_einkauf.add(tf_umrechnungsfaktor);

es soll 10 zeichen lang sein und nur zahlen und kommas zulassen..
soweit so gut. das bekomme ich hin.

jetzt will ich aber beim VERLASSEN prüfen ob es die richtige anzahl an nachkommastellen hat.
wenn nicht sollen einfach 0 angehängt werden... wenn es zu viele nachkommastellen sind sollen
die letzten einfach abgeschnitten werden.
ES DARF NICHT GERUNDET WERDEN.

also fällt NumberFormat() wohl flach.

Beispiel:(4 nachkommastellen)

beim verlassen des JFormattedTextFields soll aus
1,2 --> 1,2000 werden
oder
1,2345678 --> 1,2345

weiss wer rat??
 
S

SlaterB

Gast
Verlassen: FocusListener
Runden: bei 4 Nachkommastellen mit 10^4 multiplizieren, auf int casten, wieder teilen
Darstellen: NumberFormat
 

MScalli

Bekanntes Mitglied
leider lässt sich double und/oder Float nicht auf Integer casten!!

aber ich glaube ich habe hier eh den Falschen weg eingeschlagen.
besser wäre es gleich zu testen(schon bei der eingabe) ob diese passt.. aber wie???

mit MaskFormatter gehts leider nicht da man hier alle zeichen eingeben muss...
Code:
	try {
		tf_umrechnungsfaktor= new JFormattedTextField(new MaskFormatter("######,####"));
	} catch (ParseException e) {e.printStackTrace();}

aber eventl. kann ich das in der klasse abbrüfen in der ich die eingabe von zeichen unterdrücke und dafür sorge das nur eine bestimmte anzahl zeichen eingegeben werden kann.. also hier

Code:
import javax.swing.text.PlainDocument;
import javax.swing.text.BadLocationException;
import javax.swing.text.AttributeSet;

/**
 * Diese Klasse ist ein Dokument für Textfelder, welches...
 * 
 * 1. Eingabe auf x Zeichen begrenzt.
 * 2. Nur die Zeichen zulässt die in der Variable valid stehen
 *
 * Die Zuweisung geschieht über
 * JTextfield.setDocumenT(new Validation(int anzahl));
 */
public class DecimalDocument extends PlainDocument{

	private static final long serialVersionUID = 5032290234368360350L;
	
	private int limit;

    /**
     * Konstruktor für das Validationdokument
     * @param int limit: maximale Anzahl der einzugebenen Zeichen
     */
    public DecimalDocument(int newLimit){
        super();
        if (limit < 0){
            limit = 0;
        } else {
            limit = newLimit;
        }
    }

    /**
     * Funktion überschreibt die Methode insertString von PlaintDocument
     * @param int offset: Position
     * @param String str: der String
     * @param AttributeSet attr: Attributset
     */
    public void insertString (int offset, String str, AttributeSet attr) throws BadLocationException {
    	
        if (str == null) return;
       
        //Zeichenkette mit den gültigen Zeichen
        String valid = ".-,0123456789";
        
        for (int i=0; i<str.length();i++) {
        	System.out.println();
            if (valid.indexOf(str.charAt(i)) == -1) {
            	// wenn man hier rein kommt ist das eingegebene Zeichen ungültig!!
                return;
            }
            if ((getLength() + str.length()) > limit){
            	// wenn man hier rein kommt ist das übergebene limit erreicht
            	return;
            }
        //Wichtig Aufruf der übergeordneten Methode
        super.insertString(offset, str, attr);
    	}
    }
}
 
S

SlaterB

Gast
zu deinen Spezialdokumenten kann ich wenig sagen,
aber double kann auf int gecastet werden, wo kämen wir denn sonst hin? ;)

double x = 4.5;
int k = (int) x; // 4

wenn du die echten Objekte Double, Integer usw. meinst, dann muss man wohl den Umweg über die primitiven Datentypen gehen,
aber das ist ja kein Aufwand,

in Double gibts übrigens
http://java.sun.com/javase/6/docs/api/java/lang/Double.html#intValue()
das spart schon etwas
 

MScalli

Bekanntes Mitglied
mit dem hoch will das nicht so.. welcher operator ist das?? also ^4 nicht.

habs jetzt mal so gemacht.. aber bei 123.34 kommt da am schluss 123 raus.
die zwischensumme würd passen.. also 12343400.0

Code:
		tf_umrechnungsfaktor.addFocusListener(new FocusListener(){
			public void focusGained(FocusEvent arg0) {
			}
			public void focusLost(FocusEvent arg0) {
				// TODO Auto-generated method stub
				System.out.println("Focus Verlassen!!");
				double merk = Double.parseDouble( tf_umrechnungsfaktor.getText() );
				merk = merk *10 *10 *10 *10;
				System.out.println(merk);
				int merk_i =(int) merk /10 /10 /10 /10;
				System.out.println(merk_i);	
			}
		});
kann man eigentlich auch mit nem komma statt nem puinkt rechnen??[/code]
 
S

SlaterB

Gast
Math.pow(10,4);
aber das war nur fürs Forum, im Programm schreibe doch einfach direkt 10000 und gut ist,
muss nicht jedes Mal neu ausgerechnet werden,

um Tippfehler zu vermeiden (andere Zahl bei * und später bei /) speicherst du die Zahl in einer statischen Variable


Komma statt Punkt ist für Double.parseDouble() schlecht,
dann entweder mit String.replace() in Punkt umwandeln oder ein höheres DecimalFormat mit deutschen DecimalFormatSymbols verwenden,
das kann Komma parsen
 

MScalli

Bekanntes Mitglied
soweit so gut.. jetzt hab ich aber noch das problem das er wenn lauter 0en hinter dem komma, er diese einfach abschneidet.

mal der code
Code:
		tf_umrechnungsfaktor.addFocusListener(new FocusListener(){
			public void focusGained(FocusEvent arg0) {
			}
			public void focusLost(FocusEvent arg0) {
				// TODO Auto-generated method stub
				System.out.println("Focus Verlassen!!");
				
				// erst "," durch "." ersetzten und Wert in einer Double Variablen merken
				double merk = Double.parseDouble( tf_umrechnungsfaktor.getText().replace(",", ".") );
				
				// jetzt *10^4 rechnen und nach Integer Casten(um nachkommastellen zu enternen) 
				merk = merk * Math.pow(10,4);
				int merk_int = (int) merk;
				
                                // wieder /10^4 und nach double casten
				merk = (double) merk_int / Math.pow(10,4);
				
                                // Textfeld mit dem neuen wert füllen
				tf_umrechnungsfaktor.setText(String.valueOf(merk));
			}
		});
 
S

SlaterB

Gast
da du schon ohne Murren FocusListener & Co. selbstständig eingebaut hast,
mache ich es mir erstmal leicht und verweise auf die Anfangs-Agenda:
SlaterB hat gesagt.:
Verlassen: FocusListener
Runden: bei 4 Nachkommastellen mit 10^4 multiplizieren, auf int casten, wieder teilen
------> Darstellen: NumberFormat <----------

das Format formatiert dir die Nullen dazu

---------

ich rate auch nochmal dringend, 10^4 als statische Variable abzulegen,
das jedes Mal auszurechnen sieht übel aus, wenn auch egal
 

MScalli

Bekanntes Mitglied
jetzt hab ich nur noch das problem wenn die Zahl nicht in das formattierte passt wird mein JTextField leer gemacht und der focus springt raus.


Code:
		tf_umrechnungsfaktor.addFocusListener(new FocusListener(){
			public void focusGained(FocusEvent arg0) {
			}
			public void focusLost(FocusEvent arg0) {
				// TODO Auto-generated method stub
				System.out.println("Focus Verlassen!!");
				
				// erst "," durch "." ersetzten und Wert in einer Double Variablen merken
				double merk = Double.parseDouble( tf_umrechnungsfaktor.getText().replace(",", ".") );
				
				// jetzt *10^4 rechnen und nach Integer Casten(um nachkommastellen zu enternen) 
				merk = merk * Math.pow(10,4);
				int merk_int = (int) merk;
				
				merk = (double) merk_int / Math.pow(10,4);
				
				// Format festlegen
				DecimalFormat df =   new DecimalFormat  ( "#####0.0000" );
				System.out.println(df.format(merk));
				
				// formatiert zurück schreiben
				tf_umrechnungsfaktor.setText(String.valueOf(df.format(merk)).replace(".", ","));
			}
		});
	    pan_einkauf.add(tf_umrechnungsfaktor);

das müsste ich irgendwie abfangen und den focus wieder auf das feld setzten.. aber wie kann ich das abfangen??
 

lhein

Top Contributor
1. Prüfen ob Feld gültige Daten enthält
2. wenn nicht, dann tf_umrechnungsfaktor.requestFocusInWindow(); auslösen
 

MScalli

Bekanntes Mitglied
schön ist nicht.. aber es geht !!

Code:
	public static void prepareDecimal(JFormattedTextField tf_umrechnungsfaktor) {
		
		System.out.println(tf_umrechnungsfaktor.getText().indexOf(","));
		
		// String in ein char-Array packen und prüfen ob mehrere "," vorhanden sind
		char[] ch_hilf = new char[tf_umrechnungsfaktor.getText().length()];
		ch_hilf = tf_umrechnungsfaktor.getText().toCharArray();
		
		int komma_zaehl = 0;
		int minus_zaehl = 0;
		
		for(int i = 0; i < ch_hilf.length; i++){
			if(ch_hilf[i] == ','){
				komma_zaehl++;
			}
			if(ch_hilf[i] == '-'){
				minus_zaehl++;
			}
		}
		
		// Sind mehrere minus-Zeichen vorhanden, Textfeld löschen und Focus zurück setzten
		if(minus_zaehl > 1){
			MyError.setErrorText("M0100\nFehler: Mehrere Minuszeichen sind nicht zulässig");
			tf_umrechnungsfaktor.setText("");
			tf_umrechnungsfaktor.requestFocusInWindow();
			return;
		}
		
		// Sind mehrere kommas vorhanden, Textfeld löschen und Focus zurück setzten
		if(komma_zaehl > 1){
			MyError.setErrorText("M0100\nFehler: Mehrere Kommas sind nicht zulässig");
			tf_umrechnungsfaktor.setText("");
			tf_umrechnungsfaktor.requestFocusInWindow();
			return;
		}
		
		// passt die anzahl der vorkommastellen (wenn 1 komma vorhanden ist) 
		if(komma_zaehl == 1){
			String[] vor_nachkomma = tf_umrechnungsfaktor.getText().split(",");
			if(vor_nachkomma[0].length()>5){
				MyError.setErrorText("M0100\nFehler: zuviele Vorkommastellen");
				tf_umrechnungsfaktor.setText("");
				tf_umrechnungsfaktor.requestFocusInWindow();
				return;
			}
		}
		
		// passt die anzahl der vorkommastellen (wenn kein komma vorhanden ist) 
		if(komma_zaehl == 0){
			if(tf_umrechnungsfaktor.getText().length()>5){
				MyError.setErrorText("M0100\nFehler: zuviele Vorkommastellen");
				tf_umrechnungsfaktor.setText("");
				tf_umrechnungsfaktor.requestFocusInWindow();
				return;
			}
		}
		
		// erst "," durch "." ersetzten und Wert in einer Double Variablen merken
		double merk = Double.parseDouble( tf_umrechnungsfaktor.getText().replace(",", ".") );
		
		// jetzt *10^4 rechnen und nach Integer Casten(um nachkommastellen zu entfernen) 
		merk = merk * Math.pow(10,4);
		int merk_int = (int) merk;
		
		merk = (double) merk_int / Math.pow(10,4);
		
		// Format festlegen
		DecimalFormat df =   new DecimalFormat  ( "#####0.0000" );
		System.out.println(df.format(merk));
		
		// formatiert zurück schreiben
		tf_umrechnungsfaktor.setText(String.valueOf(df.format(merk)).replace(".", ","));
		
	}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
ReinerCoder Problem mit JFormattedTextField Java Basics - Anfänger-Themen 2
M Nur Zahlen oder ein leeres JFormattedTextField zulassen Java Basics - Anfänger-Themen 7
C JFormattedTextField soll Pflichtfeld sein Java Basics - Anfänger-Themen 19
P JFormattedTextField auslesen Java Basics - Anfänger-Themen 4
T JFormattedTextField ints auslesen Java Basics - Anfänger-Themen 11
A JFormattedTextField Zahleneingabe auch mit beginnender 0 Java Basics - Anfänger-Themen 4
E JFormattedTextField Zahl extrahieren - warum Number und nicht Double? Java Basics - Anfänger-Themen 4
A JFormattedTextField + DateFormatter Java Basics - Anfänger-Themen 3
B Kommazahl mit 2 Nachkomma-Stellen im jFormattedTextField Java Basics - Anfänger-Themen 6
P JFormattedTextField auf Ausgangszustand zurücksetzen? Java Basics - Anfänger-Themen 4
F Range für new JFormattedTextField möglich? Java Basics - Anfänger-Themen 2
G Textmarke in JFormattedTextField? Java Basics - Anfänger-Themen 2
R JFormattedTextField Zahlenbereich zulassen Java Basics - Anfänger-Themen 4
J JFormattedTextField oder NumberFormat! Java Basics - Anfänger-Themen 12
P JFormattedTextField auf x zeichen beschränken Java Basics - Anfänger-Themen 6
N Nachkommastellen von Strings Java Basics - Anfänger-Themen 3
krgewb Double mit zwei Nachkommastellen Java Basics - Anfänger-Themen 2
Kotelettklopfer Variablen Double zwingen Ganzzahlen mit 2 Nachkommastellen auszugeben Java Basics - Anfänger-Themen 10
S Algorithmus (reelle Zahl <65536 von dezimal zu dual) max. 10 Nachkommastellen Java Basics - Anfänger-Themen 4
C Konvertierung des int typs in den double typ für die Ausgabe mit Nachkommastellen Java Basics - Anfänger-Themen 4
F Nachkommastellen erzwingen Java Basics - Anfänger-Themen 2
P Nachkommastellen abschneiden Java Basics - Anfänger-Themen 7
E Nullen aus Nachkommastellen entfernen Java Basics - Anfänger-Themen 2
V Operatoren Warum kommt bei double bei den Nachkommastellen irgendwann eine 2?! (1.20000000000002) Java Basics - Anfänger-Themen 5
kilopack15 Mehr Nachkommastellen mit double Java Basics - Anfänger-Themen 14
P Zahl genauer als 20 nachkommastellen Java Basics - Anfänger-Themen 4
R Auf Nachkommastellen prüfen. Java Basics - Anfänger-Themen 2
L Nachkommastellen Runden, Problem mit Syntax " }" Java Basics - Anfänger-Themen 2
T long wird ohne Nachkommastellen ausgegeben Java Basics - Anfänger-Themen 5
M Datentypen Double = 0 / Double schneidet Nachkommastellen ab Java Basics - Anfänger-Themen 4
Luk10 Nachkommastellen runden Java Basics - Anfänger-Themen 2
J Summe mit 45 nachkommastellen Java Basics - Anfänger-Themen 8
B Datentypen Float ohne .0 ausgeben, sonstige Nachkommastellen aber erhalten Java Basics - Anfänger-Themen 4
M Erste Schritte Nachkommastellen falsch bei Rechnung Java Basics - Anfänger-Themen 3
V Nachkommastellen begrenzen (1,xxx) Java Basics - Anfänger-Themen 3
G Datentypen Double ausgeben mit minimaler Anzahl Nachkommastellen Java Basics - Anfänger-Themen 3
S Runden eines doubles auf n nachkommastellen Java Basics - Anfänger-Themen 10
M float/double Anzahl Nachkommastellen ermitteln Java Basics - Anfänger-Themen 18
L Double Zahlen und nachkommastellen Java Basics - Anfänger-Themen 5
J Nachkommastellen bei Zahlen Java Basics - Anfänger-Themen 20
M Nachkommastellen vergleichen + Array Hilfe Java Basics - Anfänger-Themen 6
D Ermitteln der Anzahl gleicher Nachkommastellen 2er Zahlen Java Basics - Anfänger-Themen 9
T Runden mit Präzision vs. Runden mit Nachkommastellen Java Basics - Anfänger-Themen 4
D Problem mit Nachkommastellen <%=Double.valueOf(35/1000)%> ergibt 0.0? Java Basics - Anfänger-Themen 3
F (Verständnis)Problem: Zahl auf 2 Nachkommastellen runden Java Basics - Anfänger-Themen 5
N Nachkommastellen auf 2 reduzieren Java Basics - Anfänger-Themen 5
J Runden auf 2 Nachkommastellen ? Java Basics - Anfänger-Themen 5
G BigDecimal mit zwei Nachkommastellen darstellen Java Basics - Anfänger-Themen 2
B Double je nach Nachkommastellen kfm runden Java Basics - Anfänger-Themen 7
H Nachkommastellen Java Basics - Anfänger-Themen 43
S Einen double-Wert formatieren auf Nachkommastellen Java Basics - Anfänger-Themen 3
K Anzahl der Nachkommastellen auslesen Java Basics - Anfänger-Themen 3
G Durch Liste iterieren und nachkommastellen runden Java Basics - Anfänger-Themen 9
M Double: Nachkommastellen begrenzen Java Basics - Anfänger-Themen 8
S Regex für Dezimalzahl. Problem mit Nachkommastellen Java Basics - Anfänger-Themen 5
C Nachkommastellen von Doublezahlen Java Basics - Anfänger-Themen 2
D Prüfen ob die Zahl nur bestimmte Nachkommastellen hat Java Basics - Anfänger-Themen 3
F double Nachkommastellen Java Basics - Anfänger-Themen 4
C Runden auf 2 Nachkommastellen klappt nicht||| WARUM Java Basics - Anfänger-Themen 13
T Nachkommastellen beim NumberFormat? Java Basics - Anfänger-Themen 2
G Gleitkommaoperationen - Nachkommastellen begrenzen Java Basics - Anfänger-Themen 2
Juelin jedit Fehler beim starten Java Basics - Anfänger-Themen 2
Kerstininer Vererbung Hilfe beim lernen von Objektorientierung für eine Klausur Java Basics - Anfänger-Themen 10
A Hilfe beim Lesen von Pfaden und Systemvariablen Java Basics - Anfänger-Themen 3
M Ausgabe beim Overloading Java Basics - Anfänger-Themen 3
W Null-Pointer Exception beim Programmstart Java Basics - Anfänger-Themen 8
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
M Nullpointer beim befüllen meiner Liste im Object Java Basics - Anfänger-Themen 3
J Beim Start des Programms zB. eine Linie in JPanel ausgeben Java Basics - Anfänger-Themen 4
I Projekte in IDE untereinander sharen / Probleme beim Build Java Basics - Anfänger-Themen 8
paulen1 Best Practice "Unchecked Assignment" Warnung beim erstellen eines 2D Arrays of Arraylists Java Basics - Anfänger-Themen 2
T Probleme beim Import eines Git-Repos Java Basics - Anfänger-Themen 2
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
N Array beim erstellen mit Werten füllen Java Basics - Anfänger-Themen 6
T DamagedFontException beim drucken Java Basics - Anfänger-Themen 3
Z SNAKE Schlange beim Aufheben von Essen verlängern Java Basics - Anfänger-Themen 4
Bugs Bunny Fehlerhafte Berechnung beim erneuten Durchlaufen der Schleife Java Basics - Anfänger-Themen 5
stormyark Fehler beim überschreiben einer Variable Java Basics - Anfänger-Themen 1
T String Array Fehler beim Index Java Basics - Anfänger-Themen 3
Fiedelbambu Prüfen von Komma stelle beim Taschenrechner Java Basics - Anfänger-Themen 5
B Objekte verschwinden beim Übersetzen Java Basics - Anfänger-Themen 5
L Beim Java Programmstart, mehrere Parameter über die Kommandozeile übergeben Java Basics - Anfänger-Themen 9
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
X Hilfe beim Übertragen in eine For-Schleife Java Basics - Anfänger-Themen 1
S Fehler beim Programm Java Basics - Anfänger-Themen 2
G Main Methode wird beim ersten Aufruf nicht richtig ausgeführt Java Basics - Anfänger-Themen 1
M String beim einlesen formatieren Java Basics - Anfänger-Themen 12
N Exception beim Verwenden von Arraylist? Java Basics - Anfänger-Themen 10
I InputStream beim zweiten Mal fehlerhaft Java Basics - Anfänger-Themen 10
C Fehler beim erstellen eines Objektes Java Basics - Anfänger-Themen 3
C Brauche Hilfe beim Schreiben eines Programmes :/ Java Basics - Anfänger-Themen 1
cmn489 Werte beim Funktionsaufruf in ein Feld übertragen(falls dieses leer ist) Java Basics - Anfänger-Themen 1
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
D Hilfe beim Erzeugen eines Arrays NullPointerException wird ausgelöst Java Basics - Anfänger-Themen 11
Nerdinfekt BMI Rechner, fehler beim Zurückgeben des Strings? Java Basics - Anfänger-Themen 2
CptK Richtigen Pfad beim einlesen von Datei finden Java Basics - Anfänger-Themen 2
O Methode in while-Schleife aufrufen geht nur beim ersten Mal Java Basics - Anfänger-Themen 2
pry bitte Hilfe beim Kreditrechner objektorientiert Java Basics - Anfänger-Themen 6
J Hilfe beim Label animieren Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben