消息对话框
Alert alert = new Alert(AlertType.INFORMATION); alert.setTitle("Information Dialog"); alert.setHeaderText("Look, an Information Dialog"); alert.setContentText("I have a great message for you!"); alert.showAndWait();
没有标题的消息对话框
Alert alert = new Alert(AlertType.INFORMATION); alert.setTitle("Information Dialog"); alert.setHeaderText(null); alert.setContentText("I have a great message for you!"); alert.showAndWait();
2. 警告对话框
Alert alert = new Alert(AlertType.WARNING); alert.setTitle("Warning Dialog"); alert.setHeaderText("Look, a Warning Dialog"); alert.setContentText("Careful with the next step!"); alert.showAndWait();
3. 错误对话框
Alert alert = new Alert(AlertType.ERROR); alert.setTitle("Error Dialog"); alert.setHeaderText("Look, an Error Dialog"); alert.setContentText("Ooops, there was an error!"); alert.showAndWait();
4. 异常对话框
这不是一个完整的异常对话框。但我们可以很容易地将 TextArea 作为可扩展的内容。
Alert alert = new Alert(AlertType.ERROR); alert.setTitle("Exception Dialog"); alert.setHeaderText("Look, an Exception Dialog"); alert.setContentText("Could not find file blabla.txt!"); Exception ex = new FileNotFoundException("Could not find file blabla.txt"); // Create expandable Exception. StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); ex.printStackTrace(pw); String exceptionText = sw.toString(); Label label = new Label("The exception stacktrace was:"); TextArea textArea = new TextArea(exceptionText); textArea.setEditable(false); textArea.setWrapText(true); textArea.setMaxWidth(Double.MAX_VALUE); textArea.setMaxHeight(Double.MAX_VALUE); GridPane.setVgrow(textArea, Priority.ALWAYS); GridPane.setHgrow(textArea, Priority.ALWAYS); GridPane expContent = new GridPane(); expContent.setMaxWidth(Double.MAX_VALUE); expContent.add(label, 0, 0); expContent.add(textArea, 0, 1); // Set expandable Exception into the dialog pane. alert.getDialogPane().setExpandableContent(expContent); alert.showAndWait();
5. 确认对话框
Alert alert = new Alert(AlertType.CONFIRMATION); alert.setTitle("Confirmation Dialog"); alert.setHeaderText("Look, a Confirmation Dialog"); alert.setContentText("Are you ok with this?"); Optionalresult = alert.showAndWait(); if (result.get() == ButtonType.OK){ // ... user chose OK } else { // ... user chose CANCEL or closed the dialog }
6. 自定义确认对话框
Alert alert = new Alert(AlertType.CONFIRMATION); alert.setTitle("Confirmation Dialog with Custom Actions"); alert.setHeaderText("Look, a Confirmation Dialog with Custom Actions"); alert.setContentText("Choose your option."); ButtonType buttonTypeOne = new ButtonType("One"); ButtonType buttonTypeTwo = new ButtonType("Two"); ButtonType buttonTypeThree = new ButtonType("Three"); ButtonType buttonTypeCancel = new ButtonType("Cancel", ButtonData.CANCEL_CLOSE); alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeTwo, buttonTypeThree, buttonTypeCancel); Optionalresult = alert.showAndWait(); if (result.get() == buttonTypeOne){ // ... user chose "One" } else if (result.get() == buttonTypeTwo) { // ... user chose "Two" } else if (result.get() == buttonTypeThree) { // ... user chose "Three" } else { // ... user chose CANCEL or closed the dialog }
7. 可输入的对话框
TextInputDialog dialog = new TextInputDialog("walter"); dialog.setTitle("Text Input Dialog"); dialog.setHeaderText("Look, a Text Input Dialog"); dialog.setContentText("Please enter your name:"); // Traditional way to get the response value. Optionalresult = dialog.showAndWait(); if (result.isPresent()){ System.out.println("Your name: " + result.get()); } // The Java 8 way to get the response value (with lambda expression). result.ifPresent(name -> System.out.println("Your name: " + name));
说明:如果用户点击了取消按钮result.isPresent()将会返回false
8. 可选择的对话框
Listchoices = new ArrayList<>(); choices.add("a"); choices.add("b"); choices.add("c"); ChoiceDialog dialog = new ChoiceDialog<>("b", choices); dialog.setTitle("Choice Dialog"); dialog.setHeaderText("Look, a Choice Dialog"); dialog.setContentText("Choose your letter:"); // Traditional way to get the response value. Optional result = dialog.showAndWait(); if (result.isPresent()){ System.out.println("Your choice: " + result.get()); } // The Java 8 way to get the response value (with lambda expression). result.ifPresent(letter -> System.out.println("Your choice: " + letter));
引用
说明:如果用户没有选择或点击了取消,result.isPresent()将会返回false
9. 自定义登录框
// Create the custom dialog. Dialog> dialog = new Dialog<>(); dialog.setTitle("Login Dialog"); dialog.setHeaderText("Look, a Custom Login Dialog"); // Set the icon (must be included in the project). dialog.setGraphic(new ImageView(this.getClass().getResource("login.png").toString())); // Set the button types. ButtonType loginButtonType = new ButtonType("Login", ButtonData.OK_DONE); dialog.getDialogPane().getButtonTypes().addAll(loginButtonType, ButtonType.CANCEL); // Create the username and password labels and fields. GridPane grid = new GridPane(); grid.setHgap(10); grid.setVgap(10); grid.setPadding(new Insets(20, 150, 10, 10)); TextField username = new TextField(); username.setPromptText("Username"); PasswordField password = new PasswordField(); password.setPromptText("Password"); grid.add(new Label("Username:"), 0, 0); grid.add(username, 1, 0); grid.add(new Label("Password:"), 0, 1); grid.add(password, 1, 1); // Enable/Disable login button depending on whether a username was entered. Node loginButton = dialog.getDialogPane().lookupButton(loginButtonType); loginButton.setDisable(true); // Do some validation (using the Java 8 lambda syntax). username.textProperty().addListener((observable, oldValue, newValue) -> { loginButton.setDisable(newValue.trim().isEmpty()); }); dialog.getDialogPane().setContent(grid); // Request focus on the username field by default. Platform.runLater(() -> username.requestFocus()); // Convert the result to a username-password-pair when the login button is clicked. dialog.setResultConverter(dialogButton -> { if (dialogButton == loginButtonType) { return new Pair<>(username.getText(), password.getText()); } return null; }); Optional > result = dialog.showAndWait(); result.ifPresent(usernamePassword -> { System.out.println("Username=" + usernamePassword.getKey() + ", Password=" + usernamePassword.getValue()); });
10. 修改对话框样式
自定义图标
// Get the Stage. Stage stage = (Stage) dialog.getDialogPane().getScene().getWindow(); // Add a custom icon. stage.getIcons().add(new Image(this.getClass().getResource("login.png").toString()));
说明:根据JavaFX 8u40最终版本的BUG报告,应该使用与它正在运行的应用程序相同的图标。在这种情况下,你还需要设置它的所有者,对话框会得到所有者的图标:
dialog.initOwner(otherStage);
不使用图标
dialog.initStyle(StageStyle.UTILITY);
11. 其他操作
设置拥有者
你可以为每一个对话框指定所有者。如果指定所有者或拥有者为null,那么它是一个顶级的、未拥有的对话框。
dialog.initOwner(parentWindow);
设置模式
你可以指定对话框的模式,包括Modality.NONE、WINDOW_MODAL或Modality.APPLICATION_MODAL。
dialog.initModality(Modality.NONE);