18

私は JavaFX アプリケーションに取り組んでいます。私のシナリオでは、2 つのオプションOKCancel. ユーザーが入力したパスワードを返しました。

パスワードダイアログを表示する私のクラスは -

public static String showPasswordDialog(String title, String message, Stage parentStage, double w, double h) {
    try {
        Stage stage = new Stage();
        PasswordDialogController controller = (PasswordDialogController) Utility.replaceScene("Password.fxml", stage);
        passwordDialogController.init(stage, message, "/images/password.png");
        if (parentStage != null) {
            stage.initOwner(parentStage);
        }
        stage.initModality(Modality.WINDOW_MODAL);
        stage.initStyle(StageStyle.UTILITY);
        stage.setResizable(false);
        stage.setWidth(w);
        stage.setHeight(h);                
        stage.showAndWait();
        return controller.getPassword(); 
    } catch (Exception ex) {
         return null;
    }

パスワード プロンプトを表示するコードは以下のとおりです。実際には、このプロンプトは他の UI の上に表示されるため、これを で囲む必要があります。Platform.runlater()そうしないと、 がスローされNot on FX application threadます。正しいパスワードを取得するまで、このパスワード プロンプトを表示する必要があります。runlater 内に表示するパスワードを含めた場合、パスワードの値を取得するにはどうすればよいですか。

他に良い方法はありますか?

final String sPassword = null;

          do {
            Platform.runLater(new Runnable() {

                @Override
                public void run() {
                     sPassword = JavaFXDialog.showPasswordDialog(sTaskName + "Password", "Enter the password:", parentStage, 400.0, 160.0);
                }
            });

            if (sPassword == null) {
                System.out.println("Entering password cancelled.");
                throw new Exception("Cancel");
            }
        } while (sPassword.equalsIgnoreCase(""));
4

2 に答える 2

43

コードをオブジェクト内にラップすることをお勧めしFutureTaskます。FutureTaskコードの一部を 1 つのスレッド (通常はワーカー、この場合はイベント キュー) で実行し、別のスレッドで安全に取得するために (とりわけ) 便利な構造です。FutureTask#getが呼び出されるまでブロックFutureTask#runされるため、パスワード プロンプトは次のようになります。

final FutureTask query = new FutureTask(new Callable() {
    @Override
    public Object call() throws Exception {
        return queryPassword();
    }
});
Platform.runLater(query);
System.out.println(query.get());

Runnable を実装しているのでFutureTask、 に直接渡すことができますPlatform#runLater(...)queryPassword()イベント キューで拒否され、その後の get の呼び出しは、そのメソッドが完了するまでブロックされます。もちろん、パスワードが実際に一致するまで、このコードをループで呼び出す必要があります。

于 2012-12-10T16:03:04.800 に答える