tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
3183
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    MScalli MScalli ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    227
    Hi Leutz.
    Ich hab ein riesen Problem.

    Es geht um die Prüfung eines JTextField bzw. JFormattedTextField.

    folgendes Problem:
    eine Zahl soll eingegeben werden.
    länge, art der Zeichen(Integer, String usw.) soll vorgegeben sein und die nachkommastellen müssen fest sein(z.B. 4 nachkommastellen..bei eingabe von 1,2 soll es 1,2000 beim verlassen des Feldes werden und bei 1,23456 UNGERUNDET 1,2345.. also einfach der rest abgeschnitten werden.)

    für die GESAMTLÄNGE der eingabe und die ART DER ZEICHEN habe ich eine Lösung..
    aber ich glaub ich bin irgendwie auf ner falschen fährte.
    Hier mal bisschen code von meinem ansatz.
    Aber ich denke das wird so nicht ganz lösbar sein..

    hier mal der das JFormattedTextField..
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
            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); 
            tf_umrechnungsfaktor.addFocusListener(new FocusListener(){
     
                public void focusGained(FocusEvent arg0) {
                }
                public void focusLost(FocusEvent arg0) {
                    // Evtl beim verlasses die nachkommastellen abschneiden/0 anhängen
                    System.out.println("Focus Verlassen!!");
                }
            });
            pan_einkauf.add(tf_umrechnungsfaktor);

    und hier die Klasse DecimalDocument..
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    
    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);
            }
        }
    }

    ist ein ziemlich komplexes problem...
    ein kompletter neuanfang wär auch ok. auch ein normales JTextField nehmen wär ok.

    plz help

    gruss
    MScalli
     

  2. #2
    Avatar von Vincentius
    Vincentius Vincentius ist offline Mitglied Brokat
    Registriert seit
    Sep 2004
    Ort
    Stuttgart
    Beiträge
    295
    Hallo,

    ich würde dafür einfach das java.text.DecimalFormat verwenden. In der Javadoc von der Klasse ist eine sehr gute Beschreibung mit Beispielen.

    Grüße
    Vincent
     

  3. #3
    MScalli MScalli ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    227
    HILFEEEE

    Habs jetzt einigfermassen hin gebracht.. leider gibts noch nen fehler.
    kann sich das evtl. mal wer anschauen

    probleme gibts nur bei der eingabe von 1 oder 2 stelligen zahlen..
    z.B wenn ich 1 eingebe wird deas TextField mit 1,001,00 gefüllt
    bei 22 wird es mit 22,0022,00 gefüllt..

    ABER WIESO?

    hier mal mein code.

    der Aufruf
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
        pan_preise_bestaende.add(lbl);
            tf_standartpreis = new JFormattedTextField();
            tf_standartpreis.setDocument(new DecimalDocument(10));
            tf_standartpreis.setFont(MyParam.getTextFieldFont());
            tf_standartpreis.setBounds(130, 10, 100, 25);
            tf_standartpreis.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
            tf_standartpreis.addFocusListener(new FocusListener(){
                public void focusGained(FocusEvent arg0) {
                    tf_standartpreis.setBackground(Color.YELLOW);
                }
                public void focusLost(FocusEvent arg0) {
                    MyPrepareClass.prepareDecimal(tf_standartpreis, "######0.00", 10, 2);
                    tf_standartpreis.setBackground(Color.WHITE);
                }
            });

    die Klasse DecimalDocument

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    
    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(str);
                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);
            }
        }
    }
    und noch MyPrepareClass mit der Methode
    prepareDecimal
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    
    import java.text.DecimalFormat;
     
    import javax.swing.JFormattedTextField;
     
     
    public class MyPrepareClass {
        
        MyPrepareClass(){
            
        }
        
        public static String date_jjjjmmtt_To_ttmmjjjj(String _datum){
            
            String datum = _datum.substring(6) + "." + _datum.substring(4, 6) + "." + _datum.substring(0,4);
            return datum;
        }
        public static String getMaskFormatterString(int string_length) {
            String mask_format = "";
            for(int i = 0; i < string_length; i++){
                mask_format += "*";
            }
            return mask_format;
        }
        public static void prepareDecimal(JFormattedTextField ftf, String vorlage, int laenge, int nachkomma) {
            
            //System.out.println(ftf.getText().indexOf(","));
            
            if(ftf.getText().equals("")){
                return;
            }
            
            // String in ein char-Array packen und prüfen ob mehrere "," vorhanden sind
            char[] ch_hilf = new char[ftf.getText().length()];
            ch_hilf = ftf.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");
                ftf.setText("");
                ftf.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");
                ftf.setText("");
                ftf.requestFocusInWindow();
                return;
            }
            
            // passt die anzahl der vorkommastellen (wenn 1 komma vorhanden ist) 
            if(komma_zaehl == 1){
                String[] vor_nachkomma = ftf.getText().split(",");
                if(vor_nachkomma[0].length()> laenge - nachkomma - 1){
                    MyError.setErrorText("M0100\nFehler: zuviele Vorkommastellen");
                    ftf.setText("");
                    ftf.requestFocusInWindow();
                    return;
                }
            }
            
            // passt die anzahl der vorkommastellen (wenn kein komma vorhanden ist) 
            if(komma_zaehl == 0){
                if(ftf.getText().length()> laenge - nachkomma - 1){
                    MyError.setErrorText("M0100\nFehler: zuviele Vorkommastellen");
                    ftf.setText("");
                    ftf.requestFocusInWindow();
                    return;
                }
            }
            
            // erst "," durch "." ersetzten und Wert in einer Double Variablen merken
            double merk = Double.parseDouble( ftf.getText().replace(",", ".") );
            merk = merk + 0.00000001; // das wird hinzuaddiert da Java beim casten abrundet!
            
            // jetzt *10^nachkomma rechnen und nach Integer Casten(um nachkommastellen zu entfernen) 
            merk = merk * Math.pow(10,nachkomma);
            int merk_int = (int) merk;
            System.out.println("merk_int : " + merk_int);
            System.out.println("merk2 : " + merk);
            
            merk = (double) merk_int / Math.pow(10,nachkomma);
            System.out.println("merk3 : " + merk);
            
            // Format festlegen
            DecimalFormat df =   new DecimalFormat  ( vorlage );
            System.out.println("merk4 : " + df.format(merk));
            
            // formatiert zurück schreiben
            System.out.println("Hier stimmts noch :" + String.valueOf(df.format(merk)).replace(".", ","));
            ftf.setText(String.valueOf(df.format(merk)).replace(".", ","));
        }
    }

    ab ner 3stelligen zahl.. also z.B. 333 wird es einwandfrei angezeigt also 333,00
     

Ähnliche Themen

  1. JFormattedTextField
    Von patrick1982l im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 29.04.10, 11:57
  2. PropertyChangeListener an JFormattedTextField
    Von nuely im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 23.10.08, 10:29
  3. Java6, JFormattedTextField und ActionListener
    Von lairdchris im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 17.07.08, 16:55
  4. JFormattedTextField mit Text?
    Von janbuecker im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 05.06.08, 19:39
  5. Problem mit JFormattedTextField
    Von maddos im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 08.05.08, 17:44