2016-07-22 15 views
1

Ich verwende Spinner in meiner JavaFX Anwendung. Ich habe unter listener zu meinem Spinner hinzugefügt, um immer den aktualisierten Wert von Spinner zu erhalten. Diese Spinner ist doppelt Wert Spinner.JavaFX Spinner werfen IllegalArgumentException: Der Start muss <= das Ende sein

lengthOverAllSpinner.getEditor().textProperty().addListener((observable, oldValue, newValue) -> { 
      try { 
       lengthOverAllSpinner.getValueFactory().setValue(Double.parseDouble(newValue)); 
      } catch (NumberFormatException e) { 
       lengthOverAllSpinner.getValueFactory().setValue(Double.parseDouble(oldValue)); 
      } 
     }); 

Aber wenn ich versuche, meine Spinner von GUI (zum Beispiel Stromwert 340,23) zu bearbeiten und wenn ich Backspace drücken und entfernen Sie den Wert bis Dezimalstelle unter Ausnahme ausgelöst wird, aber ich habe den immer aktualisierten Wert. Keine Ahnung, warum diese Ausnahme kommt. Bitte helfen:

Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: The start must be <= the end 
at javafx.scene.control.TextInputControl.getText(TextInputControl.java:446) 
at javafx.scene.control.TextInputControl.updateContent(TextInputControl.java:564) 
at javafx.scene.control.TextInputControl.replaceText(TextInputControl.java:548) 
at javafx.scene.control.TextInputControl.deleteText(TextInputControl.java:496) 
at javafx.scene.control.TextInputControl.deletePreviousChar(TextInputControl.java:897) 
at com.sun.javafx.scene.control.skin.TextFieldSkin.deleteChar(TextFieldSkin.java:589) 
at com.sun.javafx.scene.control.behavior.TextFieldBehavior.deleteChar(TextFieldBehavior.java:198) 
at com.sun.javafx.scene.control.behavior.TextInputControlBehavior.deletePreviousChar(TextInputControlBehavior.java:311) 
at com.sun.javafx.scene.control.behavior.TextInputControlBehavior.callAction(TextInputControlBehavior.java:143) 
at com.sun.javafx.scene.control.behavior.BehaviorBase.callActionForEvent(BehaviorBase.java:218) 
at com.sun.javafx.scene.control.behavior.TextInputControlBehavior.callActionForEvent(TextInputControlBehavior.java:127) 
at com.sun.javafx.scene.control.behavior.BehaviorBase.lambda$new$75(BehaviorBase.java:135) 
at com.sun.javafx.scene.control.behavior.BehaviorBase$$Lambda$206/1978625466.handle(Unknown Source) 
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218) 
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.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:3965) 
at javafx.scene.Scene$KeyHandler.access$1800(Scene.java:3911) 
at javafx.scene.Scene.impl_processKeyEvent(Scene.java:2040) 
at javafx.scene.Scene$ScenePeerListener.keyEvent(Scene.java:2502) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:197) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:147) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleKeyEvent$349(GlassViewEventHandler.java:228) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$$Lambda$459/610595104.get(Unknown Source) 
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:404) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleKeyEvent(GlassViewEventHandler.java:227) 
at com.sun.glass.ui.View.handleKeyEvent(View.java:546) 
at com.sun.glass.ui.View.notifyKey(View.java:956) 
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
at com.sun.glass.ui.win.WinApplication.lambda$null$145(WinApplication.java:101) 
at com.sun.glass.ui.win.WinApplication$$Lambda$36/2058534881.run(Unknown Source) 
at java.lang.Thread.run(Thread.java:745) 

Vielen Dank im Voraus.

Antwort

1

Ihr Problem bezieht sich auf diese isse: JavaFX Textfield with listener gives: "java.lang.IllegalArgumentException: The start must be <= the end"

Ich glaube nicht, dass es eine gute Idee ist es, den Spinner Wert im Editor TextField Ihrer Spinner einzustellen.

Aus der Dokumentation von editableProperty von Spinner:

Wenn editierbare wahr ist, wird eine Benutzereingabe, sobald der Benutzer tippt empfangen werden und drückt die Eingabetaste. Zu diesem Zeitpunkt wird die Eingabe an die SpinnerValueFactory-Konverter StringConverter.fromString (String) Methode übergeben. Der Rückgabewert dieses Aufrufs (vom Typ T) wird dann an die Methode SpinnerValueFactory.setValue (Object) an gesendet. Wenn der Wert gültig ist, bleibt er als Wert erhalten. Wenn es ungültig ist, muss der Wert Factory entsprechend reagieren und diese Änderung zurücksetzen.

Die Standardfunktion ist also, dass Sie nur den Text bearbeiten, bis Sie die Eingabetaste drücken. Auf die Eingabetaste drücken Sie den Text des TextField wird commited, und an die fromString Methode der valueFactory Ihrer Spinner übergeben. Sie könnten diesen Fall in der Fabrik wie handhaben:

lengthOverAllSpinner.getValueFactory().setConverter(new StringConverter<Double>() { 
    private final DecimalFormat df = new DecimalFormat("#.####"); 

    @Override public String toString(Double value) { 
     // If the specified value is null, return a zero-length String 
     if (value == null) { 
      return ""; 
     } 

     return df.format(value); 
    } 

    @Override public Double fromString(String value) { 
     try { 
      // If the specified value is null or zero-length, return null 
      if (value == null) 
       return null; 

      value = value.trim(); 

      if (value.length() < 1) 
       return null; 

      // Perform the requested parsing 
      return df.parse(value).doubleValue(); 

     } catch (Exception ex) { 
      return 0.0; 
     } 
    } 
}); 

Zusätzlich können Sie die Eingänge filtern, um ungültige Zeichen nicht akzeptieren, unter Verwendung eines TextFormatter auf die TextField: Zahlen

TextFormatter<Object> textFormatter = new TextFormatter<>(c -> { 

    if (c.getText().matches("[^0-9.,]+") && !c.getText().isEmpty()) 
     return null; 

    SpinnerValueFactory.DoubleSpinnerValueFactory factory = (SpinnerValueFactory.DoubleSpinnerValueFactory) spinner.getValueFactory(); 
    try { 
     Double newVal = Double.parseDouble(c.getControlNewText()); 
     return (newVal >= factory.getMin() && factory.getMax() >= newVal) ? c : null; 
    } catch (Exception ex) { 
     c.setText("0.0"); 
     return c; 
    } 
}); 

spinner.getEditor().setTextFormatter(textFormatter); 

Dieser Formatierer wird nur akzeptieren und "." und "," Zeichen.