Tratar IllegalArgumentException na Classe de Mascara DD/MM/AAAA

8 respostas Resolvido
L

Pessoal, estou usando uma Classe que implementa a Mascara DD/MM/AAAA
em um TextField. Está funcionado quase perfeitamente. O unico problema é
que quando o usuário digita uma data errada (ex: o mês) e ele apaga o campo de tras para frente (vai deletando do ano até chegar no Mes), ocorre uma
IllegalArgumentException. Entretanto, o aplicativo continua funcional. Ou seja,
se o usuario continuar e corrigir o campo data, ele pode prosseguir com o
aplicativo. Porém, como estou testando via prompt, eu vejo todos os displays
do erro no prompt (Console). Tentei usar o Try/Catch para tratar com o
objetivo de deixar o Console “limpo” (sem as inumeras msg de erro), porem
sem sucesso. Vcs sabem como isso pode ser resolvido?

8 Respostas

Andrauss

Poste seu código da máscara e a Exception.

L

Andrauss, segue:

public static void dateField(final TextField textField) {
    MaskFieldUtil.maxField(textField, 10);
    textField.lengthProperty().addListener((ChangeListener) new ChangeListener<Number>() {

        @Override
        public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
            if (newValue.intValue() < 11) {
                String value = textField.getText();
                value = value.replaceAll("[^0-9]", "");
                value = value.replaceFirst("(\\d{2})(\\d)", "$1/$2");
                value = value.replaceFirst("(\\d{2})\\/(\\d{2})(\\d)", "$1/$2/$3");
                textField.setText(value);
                MaskFieldUtil.positionCaret(textField);
            }
        }
    });
}


private static void positionCaret(TextField textField) {
    Platform.runLater(() -> {
        if (textField.getText().length() != 0) {
            textField.positionCaret(textField.getText().length());
        }
    }
    );
}
L

Andrauss, como a Exception está no Prompt (Console), eu terei q copiar como imagem (jpg, etc).
Como eu colo uma img aki? grato.

staroski

Não faz isso não, imagens costumam mais atrapalhar do que ajudar.
Está usando Windows? Clica com o botão direito no console, selecione a opção Marcar, seleciona todo o texto e pressiona ENTER e pronto! Texto copiado, aí é só colar aqui com Ctrl+V.

L

Staroski, tem razão. Grato pela sugestão. Vou colar o texto. Obrigado.

L

Segue a Exception:

Exception in thread JavaFX Application Thread java.lang.IllegalArgumentExcepti

on: The start must be <= the end

at javafx.scene.control.TextInputControl.getText(TextInputControl.java:4

46)

at javafx.scene.control.TextInputControl.updateContent(TextInputControl.

java:564)

at javafx.scene.control.TextInputControl.replaceText(TextInputControl.ja

va:548)

at javafx.scene.control.TextInputControl.deleteText(TextInputControl.jav

a:496)

at javafx.scene.control.TextInputControl.deletePreviousChar(TextInputCon

trol.java:899)

at com.sun.javafx.scene.control.skin.TextFieldSkin.deleteChar(TextFieldS

kin.java:589)

at com.sun.javafx.scene.control.behavior.TextFieldBehavior.deleteChar(Te

xtFieldBehavior.java:198)

at com.sun.javafx.scene.control.behavior.TextInputControlBehavior.delete

PreviousChar(TextInputControlBehavior.java:311)

at com.sun.javafx.scene.control.behavior.TextInputControlBehavior.callAc

tion(TextInputControlBehavior.java:143)

at com.sun.javafx.scene.control.behavior.BehaviorBase.callActionForEvent

(BehaviorBase.java:218)

at com.sun.javafx.scene.control.behavior.TextInputControlBehavior.callAc

tionForEvent(TextInputControlBehavior.java:127)

at com.sun.javafx.scene.control.behavior.BehaviorBase.lambda$new$74(Beha

viorBase.java:135)

at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.h

andleBubblingEvent(CompositeEventHandler.java:218)

at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Comp

ositeEventHandler.java:80)

at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventH

andlerManager.java:238)

at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventH

andlerManager.java:191)

at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(C

ompositeEventDispatcher.java:59)

at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDis

patcher.java:58)

at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispat

chChainImpl.java:114)

at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDis

patcher.java:56)

at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispat

chChainImpl.java:114)

at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDis

patcher.java:56)

at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispat

chChainImpl.java:114)

at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)

at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)

at javafx.event.Event.fireEvent(Event.java:198)

at javafx.scene.Scene$KeyHandler.process(Scene.java:3964)

at javafx.scene.Scene$KeyHandler.access$1800(Scene.java:3910)

at javafx.scene.Scene.impl_processKeyEvent(Scene.java:2040)

at javafx.scene.Scene$ScenePeerListener.keyEvent(Scene.java:2501)

at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.

run(GlassViewEventHandler.java:217)

at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.

run(GlassViewEventHandler.java:149)

at java.security.AccessController.doPrivileged(Native Method)

at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleKeyEvent

$353(GlassViewEventHandler.java:248)

at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Quantum

Toolkit.java:389)

at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleKeyEvent(GlassV

iewEventHandler.java:247)

at com.sun.glass.ui.View.handleKeyEvent(View.java:546)

at com.sun.glass.ui.View.notifyKey(View.java:966)

at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)

at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.ja

va:191)

at java.lang.Thread.run(Thread.java:748)
Andrauss

Fiz uns testes e vi que colocando a chamada de alteração do texto dentro do Platform.runLater resolve o problema, baseado nessa resposta.

Basicamente, pelo que entendi, o problema ocorre quando você tenta realizar uma alteração no campo dentro de um ouvinte (listner) do mesmo campo, aparentemente isso não é suportado no Fx. Com o runLater as modificações no campo serão executadas posteriormente e não entrarão em conflito com o listner.

public static void dateField(final TextField textField) {
    MaskFieldUtil.maxField(textField, 10);
    textField.lengthProperty().addListener((ChangeListener) new ChangeListener<Number>() {

        @Override
        public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
            if (newValue.intValue() < 11) {
                Platform.runLater(() -> {

                    String value = textField.getText();
                    value = value.replaceAll("[^0-9]", "");
                    value = value.replaceFirst("(\\d{2})(\\d)", "$1/$2");
                    value = value.replaceFirst("(\\d{2})\\/(\\d{2})(\\d)", "$1/$2/$3");
                    textField.setText(value);
                    MaskFieldUtil.positionCaret(textField);
                });
            }
        }
    });
}

O que fiz foi dar uma googada sobre essa exception:
Exception in thread “JavaFX Application Thread” java.lang.IllegalArgumentException: The start must be <= the end

L
Solucao aceita

Andrauss, mais uma vez obrigado. Vou fazer esta alteração e testar. Grato.

Criado 1 de agosto de 2017
Ultima resposta 4 de ago. de 2017
Respostas 8
Participantes 3