मुझे विश्वास नहीं हो रहा है कि मुझे इस पर कुछ भी नहीं मिला है। यह एक बहुत ही सामान्य उपयोग-मामला होना चाहिए।

मैं अपना टेक्स्टफिल्ड (जावाएफएक्स) सेट करना चाहता हूं ताकि उपयोगकर्ता पैटर्न द्वारा डेटा दर्ज करने तक ही सीमित हो। उदाहरण के लिए, (###) ###-#### जैसे पैटर्न वाला एक मानक यूएस टेलीफ़ोन नंबर। मुझे इस तथ्य के बाद स्वरूपण करने में कोई समस्या नहीं है, और मुझे इनपुट को केवल संख्याओं और "(", ")", और "-" को सही स्थानों पर सीमित करने पर बहुत सारे ट्यूटोरियल/उदाहरण दिखाई देते हैं, लेकिन मुझे उपयोगकर्ता नहीं चाहिए कोष्ठक और डैश दर्ज करने के लिए - वे बस वहां होने चाहिए और संख्याओं को "चारों ओर" दर्ज किया जाना चाहिए।

मैं इसे हर समय वेब पेजों पर देखता हूं - इसलिए जावास्क्रिप्ट को इसे आसानी से करना चाहिए। मैं ऐसी भाषा में काम करता था जहाँ यह कुछ इस तरह से आसान था:

myTextField.setInputPattern("(999) 999-9999") // yes this is fictional code

आप ऐसा ही किसी भी पैटर्न - ss#, डेट एंट्री, आईपी एड्रेस आदि के साथ कर सकते हैं और मैं थोड़ा स्तब्ध हूं कि मुझे इसके लिए JavaFX में कुछ नहीं मिला।

2
KenM 22 मई 2019, 02:28

1 उत्तर

सबसे बढ़िया उत्तर

अफैक ऐसी कोई कार्यक्षमता अभी तक लागू नहीं की गई है। आप अपने पैटर्न का पालन करने के लिए किसी भी इनपुट को संशोधित करने के लिए एक फिल्टर के साथ TextFormatter का उपयोग कर सकते हैं।

निम्नलिखित कोड # को अंकों के प्लेसहोल्डर के रूप में मानता है और बाकी को वैसे ही छोड़ देता है:

private static String clearText(String input) {
    return input.replaceAll("\\D+", "");
}

private static UnaryOperator<Change> createPatternFilter(String pattern) {
    Pattern digitsPattern = Pattern.compile("\\d*");
    final int maxDigits = pattern.replaceAll("[^#]*", "").length();
    return change -> {
        String text = change.getText();
        if (!digitsPattern.matcher(text).matches()) {
            return null; // prevent inputs other than digits
        }
        if (change.getControlText().equals(change.getControlNewText())) {
            return change; // allow all changes not modifying the text
        }

        String clearText = clearText(change.getControlNewText());
        String clearPrefix = clearText(change.getControlNewText().substring(0,  change.getAnchor()));
        final int prefixLength = clearPrefix.length();
        if (clearText.length() > maxDigits) {
            if (prefixLength > maxDigits) {
                return null; // cursor already positioned after the last digit placeholder
            }
            clearText = clearText.substring(0, maxDigits); // cut of excessive digits
        }
        StringBuilder resultText = new StringBuilder(pattern.length());
        int index = 0;
        int prefixIndex = 0;

        // copy parts digits before the cursor
        while (prefixIndex < prefixLength) {
            char c = pattern.charAt(index);
            if (c == '#') {
                resultText.append(clearPrefix.charAt(prefixIndex));
                prefixIndex++;
            } else {
                resultText.append(c);
            }
            index++;
        }

        // deal with following non-digit placeholders
        char c;
        while (index < pattern.length() && (c = pattern.charAt(index)) != '#') {
            resultText.append(c);
            index++;
        }

        int newAnchor = resultText.length();
        String clearSuffix = clearText.substring(prefixLength);
        int suffixIndex = 0;

        // copy remaining digits
        while (index < pattern.length() && suffixIndex < clearSuffix.length()) {
            c = pattern.charAt(index);
            if (c == '#') {
                resultText.append(clearSuffix.charAt(suffixIndex));
                suffixIndex++;
            } else {
                resultText.append(c);
            }
            index++;
        }

        resultText.append(pattern.substring(index));
        change.setRange(0, change.getControlText().length());
        change.setText(resultText.toString());
        change.selectRange(newAnchor, newAnchor);

        return change;
    };
}

@Override
public void start(Stage primaryStage) {
    String pattern = "(###) ###-####";
    TextField tf = new TextField(pattern);
    TextFormatter<String> formatter = new TextFormatter<>(createPatternFilter(pattern));
    tf.setTextFormatter(formatter);

    VBox content = new VBox(tf);

    Scene scene = new Scene(content);
    primaryStage.setScene(scene);
    primaryStage.show();
}
2
fabian 22 मई 2019, 11:34