2017-01-12 4 views
2

Я создал объект JavaFX Alert, который возвращает неожиданные результаты при вызове showAndWait. Приведенный ниже код иллюстрирует поведение, которое я наблюдаю:JavaFX Аномально закрывающее предупреждение Возвращает неправильный результат

package myPackage; 

import java.util.Optional; 

import javafx.application.Application; 
import javafx.scene.control.Alert; 
import javafx.scene.control.Alert.AlertType; 
import javafx.scene.control.ButtonBar.ButtonData; 
import javafx.scene.control.ButtonType; 
import javafx.stage.Stage; 

public class Main extends Application { 

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

    private static boolean isYes(final Optional<ButtonType> result) { 
     return (result.isPresent() && result.get().getButtonData() == ButtonData.YES); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     final Alert alert = new Alert(AlertType.CONFIRMATION, 
      "This is a test", ButtonType.NO, ButtonType.YES); 
     System.out.println(isYes(alert.showAndWait()) ? "Yes" : "No or Closed"); 
     System.out.println(isYes(alert.showAndWait()) ? "Yes" : "No or Closed"); 
    } 

} 

Когда я запускаю вышеуказанное приложение, отображаются два диалога. Нажмите «Да» в первом диалоговом окне, затем закройте (нажав «x» в верхнем правом углу) второй. Принимая эти шаги, я ожидаю, что приложение будет печатать следующее:

Да
Нет или Closed

Однако то, что я на самом деле вижу Печатаемым:

Да
Да

В заявлении Dialog documentation указано, что «ненормальное условие закрытия» (например, нажатие маленького «x» в верхнем правом углу) «попытается установить свойство результата на любое значение, возвращаемое из вызова преобразователя результатов с первым соответствующим ButtonType «. Учитывая контекст этого заявления, я интерпретировал «соответствующий ButtonType», означает, что ButtonType либо (прямая цитата из документации):

  1. Кнопка имеет ButtonType которого ButtonBar.ButtonData имеет тип ButtonBar.ButtonData .CANCEL_CLOSE.
  2. Кнопка имеет ButtonType, ButtonBar.ButtonData возвращает true, когда вызывается ButtonBar.ButtonData.isCancelButton().

Является ли моя интерпретация документации неправильно, или это ошибка в JavaFX? Независимо от того, почему это не работает, как я ожидаю, есть ли способ заставить «ненормальные условия закрытия» вернуть ButtonType.NO в этом случае?

+0

Я заметил, что если я вызываю 'alert.setResult (null)' между двумя вызовами 'alert.showAndWait()', он работает как документированный (результатом второго вызова является 'ButtonType.NO'). Есть ли когда-нибудь случай, когда 'isPresent' является ложным для' Alert'? –

+1

'isPresent' вернет false (AIUI), если вы установите результирующий конвертер на предупреждение, которое отображает кнопку« NO »на« null ». Что касается вашего основного вопроса, это выглядит как ошибка. –

+1

Кажется, это не ошибка. 'showAndWait' никогда не утверждает, что очищает свойство' result' (на самом деле это может быть даже желаемое поведение, позволяющее пользователю указать результат по умолчанию, если не указан допустимый ввод ...). – fabian

ответ

1

Это еще одна ошибка в JavaFX. Я сообщил об этом Oracle, и ему был присвоен идентификатор ошибки JDK-8173114. В работе вокруг, я просто добавил следующую строку в конструктор (ы) моего подкласса JavaFX Alert:

setOnShowing(event -> setResult(null)); 

выше работы вокруг, кажется, работает для Alert, ChoiceDialog и TextInputDialog.

Смежные вопросы