2016-08-01 22 views
5

Obecnie tworzę okno dialogowe za pomocą JavaFX. Sam Dialog działa bardzo dobrze, ale teraz próbuję dodać sprawdzanie danych wejściowych, które ostrzega użytkownika, gdy zapomni wypełnić pole tekstowe. I tu pojawia się moje pytanie: czy można zapobiec zamknięciu okna w konwerterze wyników? Tak:Nie zezwalaj na zamykanie okna dialogowego JavaFX

ButtonType buttonTypeOk = new ButtonType("Okay", ButtonData.OK_DONE); 
dialog.getDialogPane().getButtonTypes().add(buttonTypeOk); 

dialog.setResultConverter((ButtonType param) -> { 

    if (valid()) { 
     return ... 
    } else { 
     Alert alert = new Alert(Alert.AlertType.WARNING); 
     alert.setHeaderText("Pleas fill all fields!"); 
     alert.showAndWait(); 
     //prevent dialog from closing 
    } 

}); 

zauważyłem, że dialog dosn't blisko, jeśli błąd został wyrzucony wewnątrz konwertera resault ale to nie wydaje się być dobrym sposobem na rozwiązanie tego problemu.

Jeśli nie jest możliwe rozwiązanie problemu w ten sposób, mogę wyłączyć przycisk zgodnie z opisem w this post. Ale wolałbym, aby przycisk był włączony i wyświetlał komunikat.

Z góry dziękuję!

Odpowiedz

12

Jak mają zarządzać sprawdzania poprawności danych w oknie dialogowym jest faktycznie wyjaśnione w Javadoc, cytuję:

Dialog walidacji/przechwytywanie działania klawisza

W niektórych przypadkach pożądane jest uniemożliwić zamknięcie okna dialogowego, dopóki jakiś aspekt okna nie stanie się spójny wewnętrznie (np. formularz w oknie dialogowym ma wszystkie pola w prawidłowym stanie). Aby to zrobić, użytkownicy interfejsu API dialogów powinni zapoznać się z metodą DialogPane.lookupButton(ButtonType). Przekazując ButtonType (który został już ustawiony na liście typów przycisków), użytkownicy będą zwrócił węzeł, który jest typowo typu Button (ale zależy to od , jeśli metoda DialogPane.createButton(ButtonType) została nadpisana). Za pomocą tego przycisku użytkownicy mogą dodać filtr zdarzeń o nazwie , który jest wywoływany, zanim przycisk wykona normalną obsługę zdarzeń, i jako taki użytkownicy mogą uniemożliwić obsługę zdarzeń przez zużywanie zdarzenia. Oto uproszczony przykład:

final Button btOk = (Button) dlg.getDialogPane().lookupButton(ButtonType.OK); 
btOk.addEventFilter(
    ActionEvent.ACTION, 
    event -> { 
     // Check whether some conditions are fulfilled 
     if (!validateAndStore()) { 
      // The conditions are not fulfilled so we consume the event 
      // to prevent the dialog to close 
      event.consume(); 
     } 
    } 
); 

Innymi słowy, mają dodać filtra zdarzeń do przycisku spożywać zdarzenie w przypadku niespełnienia wymagań, które będą zapobiegać dialogowe zostanie zamknięte.

Więcej szczegółów here

+0

Co to jest metoda validateAndStore()? Co ma robić? –

+1

@EdvBeq ta metoda nie istnieje, chodzi tylko o pokazanie idei. Jest to tylko niestandardowa metoda, która sprawdza poprawność danych wejściowych i potencjalnie robi coś innego, jeśli sprawdzanie poprawności przebiegło pomyślnie. Jeśli zwróci true, okno dialogowe zostanie zamknięte, w przeciwnym razie zdarzenie zostanie zużyte w taki sposób, że okno dialogowe pozostanie otwarte –

Powiązane problemy