Tratar IllegalArgumentException na Classe de Mascara DD/MM/AAAA

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?

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

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

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

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.

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

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)

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

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