2015-07-22 32 views
5

Jestem nowicjuszem w JavaFx, tworzę aplikację, w której użytkownik musi wypełnić niektóre formularze i chciałem "wstępnie sprawdzić" je za pomocą wiązań. Proste elementy, takie jak żaden z elementów, nie mogą być puste lub niektóre z nich mogą zawierać tylko liczby. Oto co mam do tej pory:Oprawa warunkowa

saveBtn.disableProperty().bind(Bindings.when(
      departureHourText.textProperty().isNotEqualTo("") 
        .and(isNumber(departureHourText.getText()))) 
      .then(false) 
      .otherwise(true)); 

Oto moja isNumber metoda:

private BooleanProperty isNumber(String string) { 
    return new SimpleBooleanProperty(string.matches("[0-9]+")); 
} 

Ale trzymać przycisk jest wyłączony jest nieważne, co mam wpisać w TextField.

Każda pomoc jest bardzo doceniana.

UPDATE

Kiedy ocenić to wyrażenie: departureHourText.textProperty().isNotEqualTo("") wynik będzie: BooleanBinding [invalid]

Odpowiedz

10

wyrażenia jest nieco off.

Spróbujmy przetestować obie części swojej logicznym stwierdzeniem:

saveBtn.disableProperty().bind(Bindings.when(
     departureHourText.textProperty().isNotEqualTo("")) 
     .then(false) 
     .otherwise(true)); 

Powyższy kod działa poprawnie. Po dodaniu ciągu znaków do pola tekstowego pojawi się przycisk przełączający wydarzenie.

saveBtn.disableProperty().bind(Bindings.when(
     isNumber(departureHourText.getText())) 
     .then(false) 
     .otherwise(true)); 

Powyższy kod sprawia, że ​​przycisk jest zawsze zablokowany jako wyłączony. Zbadajmy, dlaczego.

Dodajmy oświadczenie wydruku do ISNUMBER() metoda:

private BooleanProperty isNumber(String string) { 
System.out.println("This was called"); 
return new SimpleBooleanProperty(string.matches("[0-9]+")); 
} 

Jeśli przyjrzymy się, kiedy ta jest wykonywana, gdy zaczniemy pisać, okazuje się, że nazywa się tylko wtedy, gdy początkowo zadeklarować wiążące! Dzieje się tak dlatego, że twoja metoda nie wie, kiedy należy ją wywołać, więc wiązanie tylko widzi ją początkowo, kiedy jest fałszywe, ponieważ nie ma liczb w polu.

To, co musimy zrobić, to znaleźć sposób, aby po zaktualizowaniu naszej właściwości tekstu wiedzieli o zmianie stanów. Jeśli przyjrzymy się naszemu isNotEqualTo() jako przykładowi, stwierdzimy, że prawdopodobnie będziemy chcieli znaleźć sposób na stworzenie nowego BooleanBinding.

Teraz znalazłem funkcję i zmodyfikowałem ją z linku github (https://gist.github.com/james-d/9904574). Link wskazuje, w jaki sposób możemy utworzyć nowe BooleanBinding z wzorca regex.

Najpierw zróbmy nowy wzór:

Pattern numbers = Pattern.compile("[0-9]+"); 

Następnie należy utworzyć funkcję wiążącą:

BooleanBinding patternTextAreaBinding(TextArea textArea, Pattern pattern) { 
BooleanBinding binding = Bindings.createBooleanBinding(() -> 
    pattern.matcher(textArea.getText()).matches(), textArea.textProperty()); 
return binding ; 
} 

Więc z tym możemy teraz zrobić, co chciał zrobić! Po prostu zmieniamy twoją poprzednią funkcję dla naszej nowej funkcji patternTextAreaBinding (TextArea textArea, Pattern pattern) i przekazujemy dwie nasze wartości, textArea, której chcesz śledzić, oraz Wzór, do którego chcesz się przyłączyć (nazwałem wzór powyżej liczb).

saveBtn.disableProperty().bind(Bindings.when(
     departureHourText.textProperty().isNotEqualTo("") 
       .and(patternTextAreaBinding(departureHourText,numbers))) 
     .then(false) 
     .otherwise(true)); 

Mam nadzieję, że pomoże!

0

Zastanawiam się, czy wyrażenie może być napisane bez when? If (x) then false else true; wydaje się być zbędny i może być może być uproszczony za pomocą not (x) ...

Nie może być opcja, aby po prostu użyć .not() zamiast jak w: .bind(departureHourText.textProperty().isNotEqualTo("").and(patternTextAreaBinding(departureHourText,numbers))).not())