[英]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.