Is there any way to add more than one mask to a JFormattedTextField?

2

I have JFormattedTextField for a 'price' attribute.

In it I say that its format is "R $ #####, ##". However, since I still do not know how to add events (I am learning) I would like to know if a new mask is needed (and if so, for example), for R$ ###,## or even R$ ##,## not always the values will be in the thousands, but would like to have a format, as already indicated.

    
asked by anonymous 15.06.2015 / 02:49

1 answer

1

@JNMarcos I do not believe it exists without extending and creating your own FormatterFactory. But you can use a simple solution like:

jFormattedTextField.setFocusLostBehavior(JFormattedTextField.PERSIST);

This way when the formattedTextField loses its focus it will not erase the value of the field. (This will transform your formattedTextField into a normal jTextField.)

You can use a field and treat with a listener event the value:

field.addFocusListener (new FocusAdapter () {

        @Override
        public void focusLost(FocusEvent e) {
            jFormattedTextField.addFocusListener(new FocusAdapter() {

                @Override
                public void focusLost(FocusEvent e) {
                    String text = jFormattedTextField.getText();

                    if (!text.isEmpty()) {
                        int indexOf = text.indexOf(",");//index da vírgula, se é -1 é por que não existe.

                        if (indexOf == -1) {//não existe vírgula, então completa-se com ",00"
                            text = text + ",00";

                        } else {

                            String aposVirgula = text.substring(indexOf + 1);

                            int decimais = aposVirgula.length();//obtém o tamanho do texto após a vírgula

                            if (decimais == 0) {//se Zero, é porque o valor está dessa forma "1000,"
                                text = text + "00";//então completa-se com o 2 zeros

                            } else if (decimais == 1) {// se Um então , é porque o valor está dessa forma "1000,0"
                                text = text + "0";//então completa-se com o 1 zero
                            }
                        }

                        try {
//Fazendo isso, note que seu field permite que insira caracteres. Por isso você precisará checar se o valor é um numero válido.
                            Float.valueOf(text.replace(",", "."));
                        } catch (NumberFormatException er) {
                            text = null;
                        }
                        field.setText(text);
                    }
                }
            });

I suggest you to use use one Document in JTextField instead of this code.

    
26.06.2015 / 15:59