簡體   English   中英

如何使JavaFX確認警報框等到按下OK時,但是在按下其他按鈕時執行其他操作

[英]How can I make a JavaFX confirmation alert box wait till OK is pressed but perform other actions when other buttons are pressed

我正在編寫一個Java程序,其中必須在某個特定位置創建一個新目錄。 但是,無論用戶是否要繼續,都應該有一條警告消息。 警報框必須包含以下選項:

1.繼續
2.停產
3.在Windows資源管理器中顯示目標目錄。

我已經創建了一個警報確認框(該方法返回程序是否可以繼續將文件移動到目標目錄):

private static boolean createDir(Movie movie){
    String name = movie.name.getValue();
    File file = new File(Paths.get(target.getValue(),name).toString());
    if(!file.isDirectory()) {
        file.mkdir();
        return true;
    }
    else{
        Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
        alert.setTitle("Duplicate");
        alert.setHeaderText("This folder already exists");
        alert.setContentText("Do you want to continue (this program will overwrite any files with duplicate names)");

        ButtonType show = new ButtonType("Show in Explorer");
        alert.getButtonTypes().add(show);

        Optional<ButtonType> option = alert.showAndWait();

        if (option.get() == null) {
            return false;
        } else if (option.get() == ButtonType.OK) {
            return true;
        } else if (option.get() == ButtonType.CANCEL) {
            return false;
        } else if (option.get() == show) {
            try {
                Desktop.getDesktop().open(new File(file.getPath()));
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            return false;
        }
    }
    return  false;
}

問題是,當用戶單擊“在資源管理器中顯示”時,我希望警報框保持在屏幕上。 用戶將查看已經存在的文件夾,然后單擊“確定”或“取消”(或再次在資源管理器中顯示)。

提前致謝 :)

您需要為“在資源管理器中顯示”創建一個常規按鈕,而不是使默認情況下創建的按鈕之一對應於ButtonType (默認行為是創建一個關閉對話框並設置對話框結果值的按鈕。)

如果您想要方便的Alert並且可以使用略有不同的用戶界面,可以執行以下操作

    Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
    alert.setTitle("Duplicate");
    alert.setHeaderText("This folder already exists");
    alert.setContentText("Do you want to continue (this program will overwrite any files with duplicate names)");

    Button show = new Button("Show in Explorer");
    show.setOnAction(e -> {
        try {
            Desktop.getDesktop().open(new File(file.getPath()));
        } catch (IOException e) {
            e.printStackTrace();
        }
    });
    alert.setGraphic(show);

    return alert.showAndWait().filter(ButtonType.OK::equals).isPresent();

如果希望按鈕出現在按鈕欄中,則需要子類DialogPane並重寫createButton方法以返回執行所需操作的按鈕。

這是使用此方法的完整示例:

import java.awt.Desktop;
import java.io.File;
import java.io.IOException;

import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.control.DialogPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class AlertWithRegularButton extends Application {

    @Override
    public void start(Stage primaryStage) {
        Button save = new Button("Save");
        save.setOnAction(e -> showDialog(primaryStage));

        StackPane root = new StackPane(save);
        Scene scene = new Scene(root, 250, 250);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void showDialog(Stage owner) {

        ButtonType showFileBrowserType = new ButtonType("Show in system file browser");

        DialogPane dialogPane = new DialogPane() {
            @Override
            protected Node createButton(ButtonType type) {
                if (type == showFileBrowserType) {
                    Button show = new Button(type.getText());
                    show.setOnAction(e -> {
                        try {
                            File home = new File(System.getProperty("user.home"));
                            Desktop.getDesktop().open(home);
                        } catch (IOException exc) {
                            exc.printStackTrace();
                        }
                    });
                    return show ;
                } else {
                    return super.createButton(type);
                }
            }
        };

        Alert alert = new Alert(AlertType.CONFIRMATION);
        alert.setDialogPane(dialogPane);
        alert.setTitle("Duplicate");
        alert.setHeaderText("This folder already exists");
        alert.setContentText("Do you want to continue (this program will overwrite any files with duplicate names)");
        alert.getButtonTypes().addAll(showFileBrowserType, ButtonType.CANCEL, ButtonType.OK);
        alert.initOwner(owner);
        alert.showAndWait().filter(ButtonType.OK::equals).ifPresent(b -> {
            System.out.println("OK chosen");
        });

    }

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

嘗試這個

Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
alert.setTitle("Duplicate");
alert.setHeaderText("This folder already exists");
alert.setContentText("Do you want to continue (this program will overwrite any files with duplicate names)");

ButtonType show = new ButtonType("Show in Explorer", ButtonBar.ButtonData.LEFT);
alert.getButtonTypes().add(show);

ButtonBar.setButtonUniformSize(alert.getDialogPane().lookupButton(show), false);
alert.getDialogPane().lookupButton(show).addEventFilter(ActionEvent.ACTION, event -> {
    try {
        Desktop.getDesktop().open(new File(new File(file.getPath())));
    }
    catch (IOException e) {
        e.printStackTrace();
    }

    event.consume();
});

Optional<ButtonType> option = alert.showAndWait();
return ButtonType.OK.equals(option.get());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM