2015-05-26 14 views
7

मुझे अपवाद मिल रहा है और यह समझ में नहीं आता कि इसका कारण क्या है। यह FXML फ़ाइलों के साथ एक एफएक्स ऐप है। ऐप के init() भाग में मैं एक श्रोता को एक टेक्स्टफील्ड में जोड़ता हूं जो एक फ़ंक्शन को कॉल करता है जो एक पैटर्न के लिए रेगेक्स के साथ स्ट्रिंग पर नज़र रखता है।श्रोता के साथ जावाएफएक्स टेक्स्टफील्ड देता है: "java.lang.IllegalArgumentException: प्रारंभ होना चाहिए <= अंत"

tf.textProperty().addListener(
     (observable, oldValue, newValue) -> { 
      handleInput(newValue); 
     }); 

समारोह:

private void handleInput(String s) { 

      s = s.toUpperCase(); 
      Matcher matcher = Pattern 
        .compile(
          "^[A-Z]{2}(20|21|22|23|[0-1]\\d)[0-5]\\d(20|21|22|23|[0-1]\\d)[0-5]\\d(T\\s|C\\s|TC|CT|\\s\\s)$") 
        .matcher(s); 

      if (matcher.find()) { 

        // do something 

        // then clear the textfield 
        tf.clear(); 

       } else { 
        // do something else 
       } 
      } 

यह काम करता है लेकिन मेरे मामले मिलान से मेल खाता है में एक अपवाद देता है।

अपवाद:

if (!tf.getText() == null) { 

या

:

Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: The start must be <= the end 
    at javafx.scene.control.TextInputControl.getText(Unknown Source) 
    at javafx.scene.control.TextInputControl.updateContent(Unknown Source) 
    at javafx.scene.control.TextInputControl.replaceText(Unknown Source) 
    at com.sun.javafx.scene.control.skin.TextFieldSkin.replaceText(Unknown Source) 
    at com.sun.javafx.scene.control.behavior.TextFieldBehavior.replaceText(Unknown Source) 
    at com.sun.javafx.scene.control.behavior.TextInputControlBehavior.defaultKeyTyped(Unknown Source) 
    at com.sun.javafx.scene.control.behavior.TextInputControlBehavior.callAction(Unknown Source) 
    at com.sun.javafx.scene.control.behavior.BehaviorBase.callActionForEvent(Unknown Source) 
    at com.sun.javafx.scene.control.behavior.TextInputControlBehavior.callActionForEvent(Unknown Source) 
    at com.sun.javafx.scene.control.behavior.BehaviorBase.lambda$new$75(Unknown Source) 
    at com.sun.javafx.scene.control.behavior.BehaviorBase$$Lambda$88/1978656397.handle(Unknown Source) 
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source) 
    at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source) 
    at javafx.event.Event.fireEvent(Unknown Source) 
    at javafx.scene.Scene$KeyHandler.process(Unknown Source) 
    at javafx.scene.Scene$KeyHandler.access$1800(Unknown Source) 
    at javafx.scene.Scene.impl_processKeyEvent(Unknown Source) 
    at javafx.scene.Scene$ScenePeerListener.keyEvent(Unknown Source) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(Unknown Source) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleKeyEvent$349(Unknown Source) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$$Lambda$349/1135388943.get(Unknown Source) 
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Unknown Source) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleKeyEvent(Unknown Source) 
    at com.sun.glass.ui.View.handleKeyEvent(Unknown Source) 
    at com.sun.glass.ui.View.notifyKey(Unknown Source) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.lambda$null$145(Unknown Source) 
    at com.sun.glass.ui.win.WinApplication$$Lambda$36/2117255219.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source)} 

मैं पहले से ही मैं यहाँ अन्य पदों में पाया जो कुछ सुझाव की कोशिश की, यह मिलान करने के लिए देने से पहले स्ट्रिंग की जांच करना चाहते

if (!tf.getText().equals("") { 

लेकिन अपवाद बनी हुई है। जब मैं हटा देता हूं:

tf.clear(); 

सब कुछ ठीक काम करता है।

... कोई भी विचार किसी को भी?

swinkler के समाधान के लिए संपादित करें:

स्रोतों मैं जब swinkler के कोड का उपयोग कर पाने के साथ अपवाद - JDK 1.8.0_45:

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 com.sun.javafx.scene.control.skin.TextFieldSkin.replaceText(TextFieldSkin.java:576) 
    at com.sun.javafx.scene.control.behavior.TextFieldBehavior.replaceText(TextFieldBehavior.java:202) 
    at com.sun.javafx.scene.control.behavior.TextInputControlBehavior.defaultKeyTyped(TextInputControlBehavior.java:238) 
    at com.sun.javafx.scene.control.behavior.TextInputControlBehavior.callAction(TextInputControlBehavior.java:139) 
    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$91/476337053.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.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$142/181559839.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/2117255219.run(Unknown Source) 
    at java.lang.Thread.run(Thread.java:745) 
+0

लगता है जैसे आप एक श्रोता जोड़ रहे हैं के लिए जब textProperty() पाठ क्षेत्र में परिवर्तन की:

सही तरीका आवेदन संशोधन, runLater का उपयोग कर() में देरी करने के लिए है। यदि आप ईवेंट को संभालने के दौरान टेक्स्ट को बदलना चाहते हैं, तो आपको इसे 'स्पष्ट() ' –

+0

का उपयोग करने के बजाय' नए मान 'पैरामीटर के साथ करना चाहिए, स्ट्रिंग के बाद मुझे टेक्स्ट इनपुट को नए इनपुट के लिए तैयार करना पसंद है पैटर्न मिलान किया। मैंने tf.clear() "के बजाय tf.settext (" ") का उपयोग करने का भी प्रयास किया। यह भी एक ही अपवाद देता है। – VictorRomeo

+0

बिंदु यह है कि, आपको फ़ील्ड में टेक्स्ट को संशोधित करने की कोशिश नहीं करनी चाहिए क्योंकि आप 'टेक्स्ट संशोधित' ईवेंट को संभालने के बीच में हैं। मुझे लगता है कि सही तरीका पैरामीटर 'newValue' को "" पर सेट कर रहा है। –

उत्तर

0

जब एक साधारण JavaFX में इस का उपयोग करते हुए मैं अपने त्रुटि नहीं मिल सकता है आवेदन। यहां वह कोड है जिसका उपयोग मैंने आपके कार्यान्वयन का परीक्षण करने के लिए किया था। मेरा परीक्षण इनपुट regexp से मेल खाने के लिए "AA20552055T" है - टेक्स्टफील्ड साफ़ हो जाता है।

आप अपने समाधान के साथ तुलना कृपया:

public class JavaFXApplication1 extends Application { 

    @Override 
    public void start(Stage stage) throws Exception { 
     Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); 
     Scene scene = new Scene(root); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 

} 

अपने तर्क के साथ नियंत्रक वर्ग:

public class FXMLDocumentController implements Initializable { 

    @FXML 
    private TextField textfield; 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     textfield.textProperty().addListener(
       (observable, oldValue, newValue) -> { 
        handleInput(newValue); 
       }); 
    } 

    private void handleInput(String s) { 

     s = s.toUpperCase(); 
     Matcher matcher = Pattern 
       .compile(
         "^[A-Z]{2}(20|21|22|23|[0-1]\\d)[0-5]\\d(20|21|22|23|[0-1]\\d)[0-5]\\d(T\\s|C\\s|TC|CT|\\s\\s)$") 
       .matcher(s); 

     if (matcher.find()) { 

        // do something 
        // then clear the textfield 
      textfield.clear(); 

     } else { 
      // do something else 
     } 
    } 
} 

FXML फ़ाइल:

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml/1" fx:controller="javafxapplication1.FXMLDocumentController"> 
    <children> 
     <TextField layoutX="126" layoutY="150" fx:id="textfield" /> 
    </children> 
</AnchorPane> 

टिप्पणी के बारे में, मैं स्थापित जेडीके 1.8.0_45 (1.8.0_20 से पहले) विंडोज 7 x64पर काम करनाफिर से, कोई त्रुटि नहीं।

Here is the jar नेटबीन स्वचालित रूप से बनाता है - मैंने इसे सीएमडी से परीक्षण किया। काम भी ठीक है। क्या आप परीक्षण कर सकते हैं कि सीएमडी से निष्पादित जार फ़ाइल आपकी मशीन पर ठीक काम कर रही है?

डीबगिंग के लिए - यह वह तरीका है जहां अपवाद डेटा change पैरामीटर द्वारा दिया जाता है। परिवर्तन में start और end है।

private void updateContent(TextFormatter.Change change, boolean forceNewUndoRecord) { 
     final boolean nonEmptySelection = getSelection().getLength() > 0; 
     String oldText = getText(change.start, change.end); 

आरंभ और अंत मान तो getText(...) में अपवाद को गति प्रदान:

public String getText(int start, int end) { 
     if (start > end) { 
      throw new IllegalArgumentException("The start must be <= the end"); 
     } 

     if (start < 0 
      || end > getLength()) { 
      throw new IndexOutOfBoundsException(); 
     } 

     return getContent().get(start, end); 
    } 
+0

धन्यवाद। मैंने एक कट और पेस्ट किया और एक ही त्रुटि प्राप्त की (इस बार सूत्रों के साथ, नीचे पोस्ट किया गया। मैं ब्रेक लेने के लिए प्रारंभिक * ओओप्स * - समय लागू करने के लिए भूल गया।) - बीटीडब्ल्यू। मैं जेडीके 1.8.0_45 – VictorRomeo

+0

@VictorRomeo का उपयोग कर रहा हूं: मैंने कुछ पर्यावरण जानकारी जोड़ दी है। – swinkler

+0

धन्यवाद - मुझे आपके .jar - स्क्रीनशॉट के साथ कोई त्रुटि मिलती है: http://up.picr.de/22049687bw.jpg - कोई विचार? – VictorRomeo

7

मैं एक ही problem था और बग रिपोर्ट JDK-8081700 है, जो समस्या हल मिल गया। यह एक बग नहीं निकलता है।

परीक्षण केस परिवर्तन हैंडलर के अंदर टेक्स्ट प्रॉपर्टी को संशोधित करने का प्रयास करता है। यह समर्थित नहीं है, और संपत्ति ईवेंट हैंडलर पुन: प्रवेश नहीं कर रहे हैं।

if (matcher.find()) { 
     System.err.println("true"); 
     Platform.runLater(() -> { 
      textField.clear(); 
     }); 
    } 
संबंधित मुद्दे