Я действительно хочу, чтобы кнопка ОК реагировала только тогда, когда все поля в диалоговом окне заполнены. И я также не предпочитаю отключать кнопку ОК.
Это метод из MainController, который устанавливает Dialog:
public void showItemDialog(){
Dialog<ButtonType> dialog = new Dialog<>();
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("todoItemDialog.fxml"));
try {
dialog.getDialogPane().setContent(fxmlLoader.load());
} catch (IOException e){
System.out.println("Couldn't load Dialog");
}
dialog.getDialogPane().getButtonTypes().add(ButtonType.OK);
dialog.getDialogPane().getButtonTypes().add(ButtonType.CANCEL);
Optional<ButtonType> result = dialog.showAndWait();
if(result.isPresent() && result.get() == ButtonType.OK){
DialogController controller = fxmlLoader.getController();
controller.processResults();
}
}
А это мой класс DialogController:
public class DialogController {
@FXML
private TextField descriptionTextField;
@FXML
private TextArea detailsTextArea;
@FXML
private DatePicker deadlinePicker;
@FXML
private DialogPane dialogPaneId;
public void processResults(){
String description = descriptionTextField.getText();
String details = detailsTextArea.getText();
LocalDate date = deadlinePicker.getValue();
TodoData.getInstance().addTodoItem(new TodoItem(description, details, date));
}
public boolean areFieldsEmpty(){
//checks if fields are empty...
return (descriptionTextField.getText().trim().isEmpty() || detailsTextArea.getText().trim().isEmpty() ||
deadlinePicker.getValue() == null);
}
}
Теперь я думаю, что кнопка EventHandler for OK должна выглядеть примерно так:
Button okButton = (Button) dialogPaneId.lookupButton(ButtonType.OK);
okButton.addEventFilter(ActionEvent.ACTION, new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("was here");
if(areFieldsEmpty()){
event.consume();
}
}
});
Но это не работает в классе MainController или в классе DialogController (показывает NullPointerException). Я новичок в JavaFX, также я много искал его здесь, но не смог найти какой-либо конкретный результат c. Заранее спасибо.