3

このダイアログクラスを使用してプロジェクトを作成しています。確認ダイアログを使用しようとすると、[はい]ボタンのEventHandlerを作成し、それをメソッド呼び出しに渡す必要があります。実行しましたが、クリックしてログアウトすると、確認の[はい]ボタンをクリックする前にイベントが実行されます。

メソッド呼び出し

public void btnSairClicked(ActionEvent event) {

    Dialog.buildConfirmation("Confirmar", "Deseja realmente sair?")
            .addYesButton(actionPerformed(event))
            .addNoButton(null)
            .build()
            .show();

}

private EventHandler actionPerformed(ActionEvent event) {
    String loginUrl = "http://" + Constants.TARGET_HOST + ":" + Constants.TARGET_PORT + Constants.TARGET_SERVICE_LOGOUT_PATH;
    try {
        JSONObject json = HttpUtil.getJSON(false, loginUrl, null, null, null);
        loginManager.logout();
    } catch (IOException ex) {
        Logger.getLogger(MainViewController.class
                .getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}

ダイアログクラス:

public static Builder buildConfirmation(String title, String message) {
        return buildConfirmation(title, message, null);
    }

public static Builder buildConfirmation(String title, String message, Window owner) {
        return new Builder()
            .create()
            .setOwner(owner)
            .setTitle(title)
            .setConfirmationIcon()
            .setMessage(message);
    }

public Builder addYesButton(EventHandler actionHandler) {
            return addConfirmationButton("Sim", actionHandler);
        }

protected Builder addConfirmationButton(String buttonCaption, final EventHandler actionHandler) {
            Button confirmationButton = new Button(buttonCaption);
            confirmationButton.setMinWidth(BUTTON_WIDTH);
            confirmationButton.setOnAction(new EventHandler<ActionEvent>() {

                public void handle(ActionEvent t) {
                    stage.close();
                    if (actionHandler != null)
                        actionHandler.handle(t);
                }
            });

            stage.buttonsPanel.getChildren().add(confirmationButton);
            return this;
        }
4

1 に答える 1

3

あなたは実際にaを返す関数を渡しているので、実際に関数からパラメーターとして期待されるEventHandleraを返すことが真になりEventHandlerます(あなたの関数は持っていますreturn null;、私は本当にそれについて何も知りません)。これは、割り当てたときに実行される関数でもあります(基本的には呼び出しです)。したがって、を返す関数だけでなく、最初に完全なハンドラーを作成する必要がありますEventHandler。これで、クリックイベントで処理できるようになりました。ダイアログラインにブレークポイントを設定してデバッグし、私が言ったことを確認できます。

class MyHandler implements EventHandler<Event> {

    private String button = "";

    public MyHandler(String s) {
        this.button = s;
    }

    @Override
    public void handle(Event t) {
        if(button.equals("Yes")) {
            // do yes
            System.out.println("Yes");
        }
        else {
            // do no
            System.out.println("No");
        }
    }

}

Dialogを使用すると、以下のようにする必要があります

 Dialog.buildConfirmation("Confirmar", "Deseja realmente sair?")
                    .addYesButton(new MyHandler("Yes"))
                    .addNoButton(new MyHandler("No"))
                    .build()
                    .show();

お役に立てれば。

編集 :

コンストラクターを作成しましたが、String pass yesを受け入れて、yesベースの操作などを実行します。文字列を確認して、操作を実行します。

于 2013-02-12T15:44:02.033 に答える