2017-01-12 5 views
2

showAndWaitを呼び出すと予期しない結果を返すJavaFX Alertオブジェクトを作成しました。以下のコードは、私が観察している動作を示しています。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"); 
    } 

} 

上記のアプリケーションを実行すると、2つのダイアログが表示されます。最初のダイアログで「Yes」をクリックし、次に右の角の「x」をクリックして閉じる。上記の手順を取ることによって、私は、アプリケーションが次のように印刷するだろうと期待して:

はい
ないか

を休館しかし、私が実際に印刷見ていますと、次のとおりです。

はい
はい

Dialog documentationは、「異常終了条件」(右上隅の小さな「x」をクリックするなど)は、「最初に一致するButtonTypeで結果コンバーターを呼び出すことで返される値に結果プロパティーを設定しようとします"

  1. ボタンは、そのButtonBar.ButtonDataタイプButtonBar.ButtonDataであるButtonTypeがあります。この文の文脈を考えると、私はどちらか(文書から直接引用)というButtonTypeを意味する「マッチングButtonTypeを」解釈しました.CANCEL_CLOSE。
  2. ボタンには、ButtonBar.ButtonData.isCancelButton()が呼び出されたときにButtonBar.ButtonDataがtrueを返すButtonTypeがあります。

私のドキュメントの解釈が間違っているのですか、これはJavaFXのバグですか?私が期待しているようにこれがなぜ機能しないのかとは関係なく、「異常終了条件」がこの場合にはButtonType.NOを返すように強制することはできますか?

+0

'alert.showAndWait()'の2回の呼び出しの間に 'alert.setResult(null)'を呼び出すと、文書化されたように動作します(2番目の呼び出しの結果が 'ButtonType.NO'です)。 'isPresent'が' Alert'に対してfalseであるケースはありますか? –

+1

'isPresent'は、' NO'ボタンを 'null'にマップしたアラートに結果コンバーターを設定すると、false(AIUI)を返します。あなたの主な質問は、これはバグのようです。 –

+1

これはバグではありません。 'showAndWait'は決して' result'プロパティをクリアすると主張しません(実際、これは、有効な入力が指定されていない場合にユーザがデフォルトの結果を指定できるようにする望ましい動作でもあります)。 – fabian

答えて

1

これはJavaFXのさらに別のバグです。私はOracleに報告しており、バグID JDK-8173114が割り当てられています。回避策として、私は単にJavaFXのAlertの私のサブクラスのコンストラクタ(複数可)に次の行を追加しました:

setOnShowing(event -> setResult(null)); 

上記の回避策AlertChoiceDialog、およびTextInputDialogのために働くようです。

関連する問題