tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
5
ZUGRIFFE
773
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 Prüfe TFormattedTextFields bei der eingabe ab und habe jetzt zwei Probleme.
    Habe jetzt mal ein ein lauffähiges Prog dazu geschrieben damit sich das jemand anschauen kann.

    mein 1 Problem.
    sobald ich nur eine 1 stellige oder 2 stellige zahl eingebe, gibt er sie 2 mal aus..

    z.B. eingabe 1 ausgabe 1,001,00

    kann sich das bitte wer anschauen

    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
    
    import java.awt.Color;
    import java.awt.event.FocusEvent;
    import java.awt.event.FocusListener;
     
    import javax.swing.JFormattedTextField;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
     
     
    public class TestJFormattedTextField {
     
        TestJFormattedTextField(){
            JFrame frame = new JFrame();
            frame.setSize(400,400);
            
            JLabel lbl;
            final JFormattedTextField tf_selbstkosten, tf_vk_preis1;
            JPanel panel = new JPanel();
            
            frame.add(panel);
            panel.setLayout(null);
            
            lbl = new JLabel("Selbstkosten");
            lbl.setBounds(10, 15, 100, 25);
            panel.add(lbl);
                tf_selbstkosten = new JFormattedTextField();
                tf_selbstkosten.setDocument(new DecimalDocument(10));
                tf_selbstkosten.setBounds(130, 15, 100, 25);
                tf_selbstkosten.setHorizontalAlignment(javax.swing.JTextField.RIGHT); 
                tf_selbstkosten.addFocusListener(new FocusListener(){
                    public void focusGained(FocusEvent arg0) {
                        tf_selbstkosten.setBackground(Color.YELLOW);
                    }
                    public void focusLost(FocusEvent arg0) {
                        MyPrepareClass.prepareDecimal(tf_selbstkosten, "######0.00", 10, 2);
                        tf_selbstkosten.setBackground(Color.WHITE);
                    }
                });
                panel.add(tf_selbstkosten);
                
            lbl = new JLabel("VK-Preis 1");
            lbl.setBounds(10, 40, 100, 25);
            panel.add(lbl);
              tf_vk_preis1 = new JFormattedTextField();
              tf_vk_preis1.setDocument(new DecimalDocument(10)); 
              tf_vk_preis1.setBounds(130, 40, 100, 25);
              tf_vk_preis1.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
              tf_vk_preis1.addFocusListener(new FocusListener(){
                public void focusGained(FocusEvent arg0) {
                  tf_vk_preis1.setBackground(Color.YELLOW);
                }
                public void focusLost(FocusEvent arg0) {
                  MyPrepareClass.prepareDecimal(tf_vk_preis1, "######0.00", 10, 2);
                  tf_vk_preis1.setBackground(Color.WHITE);
                }
              });
                panel.add(tf_vk_preis1);
                
            frame.setVisible(true);
        }
        
        public static void main(String[] args) {
            new TestJFormattedTextField();
     
        }
    }

    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
    
    import java.text.DecimalFormat;
     
    import javax.swing.JFormattedTextField;
     
     
    public class MyPrepareClass {
      
      MyPrepareClass(){
        
      }
     
      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){
     
          ftf.setText("");
          ftf.requestFocusInWindow();
          return;
        }
        
        // Sind mehrere kommas vorhanden, Textfeld löschen und Focus zurück setzten
        if(komma_zaehl > 1){
     
          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){
     
            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){
     
            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(".", ","));
      }
    }

    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);
          }
        }
    }

    ein kleines Prob ist auch das festlegen von den Nachkommastellen..
    da ich höchstens 4 nachkommastellen haben kann habe ich es so gelöst..

    merk = merk + 0.00000001; // das wird hinzuaddiert da Java beim casten abrundet!

    aber das iss wohl net die feine englische art
    evtl. weiss da auch einer ne lösung!

    ------------------------------------------------------
    Ist das überhaupt der richtige Ansatz
    Wie macht ihr sowas
     

  2. #2
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Hmm auch nicht ganz schön aber vllt ein wenig übersichtlicher:
    Code java:
    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
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    
    package de.tutorials;
     
    import java.awt.Color;
    import java.awt.event.FocusEvent;
    import java.awt.event.FocusListener;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import java.math.RoundingMode;
    import java.text.DecimalFormat;
    import java.text.DecimalFormatSymbols;
    import java.util.Locale;
     
    import javax.swing.JFormattedTextField;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.WindowConstants;
    import javax.swing.text.NumberFormatter;
     
    public class TestJFormattedTextField {
     
        private static final class MyFormattedTextField extends JFormattedTextField {
            private int maxLength;
            private int nachKommaCnt;
            private int vorkommaCnt;
            private String vorlage;
            private DecimalFormat df;
     
            MyFormattedTextField(int maxLength, int nachKommaCnt) {
                super();
                this.maxLength = maxLength;
                this.nachKommaCnt = nachKommaCnt;
                this.vorkommaCnt = maxLength - nachKommaCnt - 1;
                init();
            }
     
            private void init() {
                createFormatTemplate();
                this.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
     
                this.addFocusListener(new FocusListener() {
                    public void focusGained(FocusEvent arg0) {
                        MyFormattedTextField.this.setBackground(Color.YELLOW);
                    }
     
                    public void focusLost(FocusEvent arg0) {
                        prepareDecimal();
                        MyFormattedTextField.this.setBackground(Color.WHITE);
                    }
                });
     
                this.addKeyListener(new KeyAdapter() {
     
                    @Override
                    public void keyReleased(KeyEvent evt) {
                        final String valid = "-,0123456789";
                        // Kontrollzeichen zulassen
                        if (Character.isISOControl(evt.getKeyChar())) {
                            return;
                        }
                        // Wenn nicht in gültigen Zeichen ignorieren
                        if (valid.indexOf(evt.getKeyChar()) == -1) {
                            evt.consume();
                        }
                        
                        //Hier könnte man evtl auch noch prüfen ob
                        //maximal ein Komma und Minuszeichen vorkommt
                        //oder auch die Gesamtlänge des Text
                    }
     
                });
            }
     
            private void createFormatTemplate() {
                //Template zusammenbauen aus den Längen
                final String vorkommaString = createString(vorkommaCnt, "#") + "0";
                final String nachkommaString = createString(nachKommaCnt, "0");
                final String vorlage = vorkommaString + "." + nachkommaString;
                this.df = new DecimalFormat(vorlage, DecimalFormatSymbols
                        .getInstance(Locale.GERMANY));
                //wie soll gerundet werden?
                this.df.setRoundingMode(RoundingMode.HALF_DOWN);
     
            }
     
            private static String createString(int num, String fill) {
                //fill mal num
                final StringBuilder b = new StringBuilder();
                for (int i = 0; i < num; i++) {
                    b.append(fill);
                }
                return b.toString();
            }
     
            /**
             * Zählt das vorkommen von search in strg.
             */
            private int count(String strg, String search) {
                int cnt = -1;
                int index = strg.indexOf(strg);
                while (index != -1) {
                    cnt++;
                    index = strg.indexOf(strg, index + 1);
                }
                return cnt;
            }
     
            private void prepareDecimal() {
                final String txt = this.getText().trim();
     
                if (txt.equals("")) {
                    return;
                }
     
                // String in ein char-Array packen und prüfen ob mehrere ","
                // vorhanden
                // sind
                final int komma_zaehl = count(txt, ",");
                final int minus_zaehl = count(txt, "-");
     
                // Sind mehrere minus-Zeichen vorhanden, Textfeld löschen und Focus
                // zurück setzten
                if (minus_zaehl > 1 || komma_zaehl > 1) {
                    this.setText("");
                    this.requestFocusInWindow();
                    return;
                }
     
                // passt die anzahl der vorkommastellen (wenn 1 komma vorhanden ist)
                final String vorKomma;
                if (komma_zaehl == 1) {
                    String[] vor_nachkomma = txt.split(",");
                    vorKomma = vor_nachkomma[0];
                } else {
                    vorKomma = txt;
                }
     
                if (vorKomma.length() > vorkommaCnt) {
                    this.setText("");
                    this.requestFocusInWindow();
                    return;
                }
     
                // erst "," durch "." ersetzten und Wert in einer Double Variablen
                // merken
                double merk = Double.parseDouble(txt.replace(",", "."));
     
                final String formatted = df.format(merk);
     
                // formatiert zurück schreiben
                this.setText(formatted);
            }
     
        }
     
        TestJFormattedTextField() {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            frame.setSize(400, 400);
     
            JPanel panel = new JPanel();
            frame.add(panel);
            panel.setLayout(null);
     
            JLabel lbl = new JLabel("Selbstkosten");
            lbl.setBounds(10, 15, 100, 25);
            panel.add(lbl);
            JFormattedTextField tf_selbstkosten = new MyFormattedTextField(10, 2);
            tf_selbstkosten.setBounds(130, 15, 100, 25);
            panel.add(tf_selbstkosten);
     
            lbl = new JLabel("VK-Preis 1");
            lbl.setBounds(10, 40, 100, 25);
            panel.add(lbl);
     
            JFormattedTextField tf_vk_preis1 = new MyFormattedTextField(10, 2);
            tf_vk_preis1.setBounds(130, 40, 100, 25);
            panel.add(tf_vk_preis1);
     
            frame.setVisible(true);
        }
     
        public static void main(String[] args) {
            new TestJFormattedTextField();
     
        }
    }

    Zumindest tuts das was es soll und man muß nicht so viel rumparsen.
     

  3. #3
    MScalli MScalli ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    227
    Leider hab ich hier das Problem das gerundet wird.
    Also bei der eingabe von 1,999 wird es 2,00.

    ist es möglich das runden irgendwie zu umgehen
    die Zahl soll einfach nur abgeschnitten werden.

    ausserdem ist die eingabe von z.B. 12345,11 (oder mehr stellen) nicht möglich
    Geändert von MScalli (28.05.08 um 08:24 Uhr)
     

  4. #4
    MScalli MScalli ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    227
    Also ich habe jetzt eine Lösung für mein Problem..
    ziemlich unschön(wie ich denke) aber es geht.

    Bei meinem Prog oben einfach bei kleineren Zahlen die vorangehenden Stellen mit Blanks füllen
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    .
    .
            // Format festlegen
            DecimalFormat df =   new DecimalFormat  ( vorlage );
            
            String str_hilf = String.valueOf(df.format(merk)).replace(".", ",");
            for(int i =  str_hilf.length(); i < laenge; i++){
                str_hilf = " " + str_hilf;
            }
            System.out.println("*" + str_hilf + "*");
     
            ftf.setText(str_hilf);

    Ich bin aber immer noch offen wenn wer ne schönere Lösung hat

    Vielen dank zeja für deine Hilfe!!
     

  5. #5
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Naja sonderlich reingeguckt hast du in meinen Code offenbar nicht...

    Wenn du DecimalFormat mit der Deutschen Locale Initialisierst bekommst du z.B. direkt Kommas und brauchst das nicht nachträglich mit nem Replace ändern.

    Und warum füllst du jetzt was mit Leerzeichen auf?

    Leider gibt es keinen RoundingMode.NONE /CUT.
    Die Stelle danach mit einer 0 ersetzen funktioniert aber auch:

    Code java:
    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
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    
    package de.tutorials;
     
    import java.awt.Color;
    import java.awt.event.FocusEvent;
    import java.awt.event.FocusListener;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import java.math.BigDecimal;
    import java.math.RoundingMode;
    import java.text.DecimalFormat;
    import java.text.DecimalFormatSymbols;
    import java.util.Locale;
     
    import javax.swing.JFormattedTextField;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.WindowConstants;
    import javax.swing.text.NumberFormatter;
     
    public class TestJFormattedTextField {
     
        private static final class MyFormattedTextField extends JFormattedTextField {
            private int maxLength;
            private int nachKommaCnt;
            private int vorkommaCnt;
            private String vorlage;
            private DecimalFormat df;
     
            MyFormattedTextField(int maxLength, int nachKommaCnt) {
                super();
                this.maxLength = maxLength;
                this.nachKommaCnt = nachKommaCnt;
                this.vorkommaCnt = maxLength - nachKommaCnt - 1;
                init();
            }
     
            private void init() {
                createFormatTemplate();
                this.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
     
                this.addFocusListener(new FocusListener() {
                    public void focusGained(FocusEvent arg0) {
                        MyFormattedTextField.this.setBackground(Color.YELLOW);
                    }
     
                    public void focusLost(FocusEvent arg0) {
                        prepareDecimal();
                        MyFormattedTextField.this.setBackground(Color.WHITE);
                    }
                });
     
                this.addKeyListener(new KeyAdapter() {
     
                    @Override
                    public void keyReleased(KeyEvent evt) {
                        final String valid = "-,0123456789";
                        // Kontrollzeichen zulassen
                        if (Character.isISOControl(evt.getKeyChar())) {
                            return;
                        }
                        // Wenn nicht in gültigen Zeichen ignorieren
                        if (valid.indexOf(evt.getKeyChar()) == -1) {
                            evt.consume();
                        }
     
                        // Hier könnte man evtl auch noch prüfen ob
                        // maximal ein Komma und Minuszeichen vorkommt
                        // oder auch die Gesamtlänge des Text
                    }
     
                });
            }
     
            private void createFormatTemplate() {
                // Template zusammenbauen aus den Längen
                final String vorkommaString = createString(vorkommaCnt, "#") + "0";
                final String nachkommaString = createString(nachKommaCnt, "0");
                final String vorlage = vorkommaString + "." + nachkommaString;
     
                this.df = new DecimalFormat(vorlage, DecimalFormatSymbols
                        .getInstance(Locale.GERMANY));
                // wie soll gerundet werden?
                this.df.setRoundingMode(RoundingMode.HALF_UP);
     
            }
     
            private static String createString(int num, String fill) {
                // fill mal num
                final StringBuilder b = new StringBuilder();
                for (int i = 0; i < num; i++) {
                    b.append(fill);
                }
                return b.toString();
            }
     
            /**
             * Zählt das vorkommen von search in strg.
             */
            private int count(String strg, String search) {
                int cnt = 0;
                int index = strg.indexOf(strg);
                while (index != -1) {
                    cnt++;
                    index = strg.indexOf(strg, index + 1);
                }
                return cnt;
            }
     
            private void prepareDecimal() {
                String txt = this.getText().trim();
     
                if (txt.equals("")) {
                    return;
                }
     
                // String in ein char-Array packen und prüfen ob mehrere ","
                // vorhanden
                // sind
                final int komma_zaehl = count(txt, ",");
                final int minus_zaehl = count(txt, "-");
     
                // Sind mehrere minus-Zeichen vorhanden, Textfeld löschen und Focus
                // zurück setzten
                if (minus_zaehl > 1 || komma_zaehl > 1) {
                    this.setText("");
                    this.requestFocusInWindow();
                    return;
                }
     
                // passt die anzahl der vorkommastellen (wenn 1 komma vorhanden ist)
                final String vorKomma;
                if (komma_zaehl == 1) {
                    String[] vor_nachkomma = txt.split(",");
                    vorKomma = vor_nachkomma[0];
     
                    int index = txt.indexOf(",");
     
                    if (txt.length() >= index + (nachKommaCnt + 2)) {
                        // Stelle nach den maximalen Kommastellen auf 0 setzen,
                        // damit
                        // abgeschnitten statt gerundet wird
                        StringBuffer b = new StringBuffer(txt);
                        String temp = b.replace(index + (nachKommaCnt + 1),
                                index + (nachKommaCnt + 2), "0").toString();
                        txt = temp;
                    }
     
                } else {
                    vorKomma = txt;
                }
     
                if (vorKomma.length() > vorkommaCnt) {
                    this.setText("");
                    this.requestFocusInWindow();
                    return;
                }
     
                // erst "," durch "." ersetzten und Wert in einer Double Variablen
                // merken
                double merk = Double.parseDouble(txt.replace(",", "."));
     
                BigDecimal decimal = BigDecimal.valueOf(merk);
                decimal.setScale(3, RoundingMode.FLOOR);
     
                final String formatted = df.format(decimal);
     
                // formatiert zurück schreiben
                this.setText(formatted);
            }
     
        }
     
        TestJFormattedTextField() {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            frame.setSize(400, 400);
     
            JPanel panel = new JPanel();
            frame.add(panel);
            panel.setLayout(null);
     
            JLabel lbl = new JLabel("Selbstkosten");
            lbl.setBounds(10, 15, 100, 25);
            panel.add(lbl);
            JFormattedTextField tf_selbstkosten = new MyFormattedTextField(10, 2);
            tf_selbstkosten.setBounds(130, 15, 100, 25);
            panel.add(tf_selbstkosten);
     
            lbl = new JLabel("VK-Preis 1");
            lbl.setBounds(10, 40, 100, 25);
            panel.add(lbl);
     
            JFormattedTextField tf_vk_preis1 = new MyFormattedTextField(10, 2);
            tf_vk_preis1.setBounds(130, 40, 100, 25);
            panel.add(tf_vk_preis1);
     
            frame.setVisible(true);
        }
     
        public static void main(String[] args) {
            new TestJFormattedTextField();
     
        }
    }
     

  6. #6
    MScalli MScalli ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    227
    hehe.. jetzt habe ich sogar 2 möglichkeiten
    meins funktioniert jetzt auch einwandfrei.

    Aber wenn meinst das die andere Lösung schneller ist dann werd ich das die nächsten Tage umbauen.

    und auf die Idee mit der 0 hinhängen bin ich echt nicht gekommen..
    Ich glaub das ist einiges weniger an aufwand

    nochmal 1000 dank @ zeja
     

Ähnliche Themen

  1. Hochkomma in Textfeldern...
    Von Darian im Forum PHP
    Antworten: 3
    Letzter Beitrag: 17.09.08, 04:30
  2. Array in Textfeldern
    Von kaya001 im Forum Visual Basic 6.0
    Antworten: 2
    Letzter Beitrag: 14.09.07, 17:11
  3. Ausgabe in Textfeldern
    Von counteract im Forum PHP
    Antworten: 2
    Letzter Beitrag: 22.10.06, 09:57
  4. Links in Textfeldern
    Von fenixs im Forum VisualStudio & MFC
    Antworten: 1
    Letzter Beitrag: 04.02.05, 08:40
  5. Vernüpfung von Textfeldern in PP
    Von Olli KH im Forum Office-Anwendungen
    Antworten: 2
    Letzter Beitrag: 01.04.04, 12:07