Руководство JavaFX Alert Dialog

1- JavaFX Alert

Класс  Alert (Алерт) это подкласс  Dialog (Диалог) и предоставляет поддержку для некоторых видов  dialog построенных заранее, которые легко отображаются для пользоваетеля, чтобы напомнить об ответе. Поэтому, для многих пользователей, класс Alert является самым подходящим классом для их нужды (обратно прямому использованию  Dialog). Помимо этого, если вы хотите напомнить пользователю ввести текст или выбрать из списка вариантов (list of options), обслуживание будет лучше если использовать соотвествующие  TextInputDialog и ChoiceDialog.
Alert по умолчанию является окном с модальностью (modelity) Modelity.WINDOW_MODAL. Но вы можете изменить используя метод alert.initModality(Modality).
По умолчанию, если определенное окно открывает  Alert оно будет родительским окном того  Alert.
Вы можете посмотреть более подробное объяснение про  Modelity в следующих статьях:
  • TODO Link!
Ниже является иллюстрация структуры окна Alert:

Header Region (Регион Header):

Этот регион используется для отображения коротких оповещений и иконок (icon).

Content Region (Регион содержания):

По умолчанию  Content Region отображает  Label, вы можете настроить текстовое содержание данному Label через метод  alert.setContentText(String). Вы так же можете отобразить другой Node в Content Region через  alert.getDialogPane().setContent(Node).

Footer Region (Регион Footer):

Этот регион используется для отображения Button, вы можете кастомизировать все button, которые будут отображены.

2- Information Alert

Information Alert (Информационное оповещение) это окно  dialog отображающее информацию. Ниже является изображение стандартного  Information Alert:
Изображение  Information Alert с Header Text по умолчанию:
Изображение  Information Alert не имеет  Header Text:

Пример:

InformationAlertExample.java
package org.o7planning.javafx.alert;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class InformationAlertExample extends Application {

	// Show a Information Alert with header Text
	private void showAlertWithHeaderText() {
		Alert alert = new Alert(AlertType.INFORMATION);
		alert.setTitle("Test Connection");
		alert.setHeaderText("Results:");
		alert.setContentText("Connect to the database successfully!");

		alert.showAndWait();
	}

	// Show a Information Alert with default header Text
	private void showAlertWithDefaultHeaderText() {
		Alert alert = new Alert(AlertType.INFORMATION);
		alert.setTitle("Test Connection");

		// alert.setHeaderText("Results:");
		alert.setContentText("Connect to the database successfully!");

		alert.showAndWait();
	}

	// Show a Information Alert without Header Text
	private void showAlertWithoutHeaderText() {
		Alert alert = new Alert(AlertType.INFORMATION);
		alert.setTitle("Test Connection");

		// Header Text: null
		alert.setHeaderText(null);
		alert.setContentText("Connect to the database successfully!");

		alert.showAndWait();
	}

	@Override
	public void start(Stage stage) {

		VBox root = new VBox();
		root.setPadding(new Insets(10));
		root.setSpacing(10);

		Button button1 = new Button("Information Alert");
		Button button2 = new Button("Information Alert with default Header Text");
		Button button3 = new Button("Information Alert without Header Text");

		button1.setOnAction(new EventHandler<ActionEvent>() {

			@Override
			public void handle(ActionEvent event) {
				showAlertWithHeaderText();
			}
		});

		button2.setOnAction(new EventHandler<ActionEvent>() {

			@Override
			public void handle(ActionEvent event) {
				showAlertWithDefaultHeaderText();
			}
		});

		button3.setOnAction(new EventHandler<ActionEvent>() {

			@Override
			public void handle(ActionEvent event) {
				showAlertWithoutHeaderText();
			}
		});

		root.getChildren().addAll(button1, button2, button3);

		Scene scene = new Scene(root, 450, 250);
		stage.setTitle("JavaFX Information Alert (o7planning.org)");
		stage.setScene(scene);

		stage.show();

	}

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

}

3- Warning Alert

Warning Alert очень похож на  Information Alert, кроме его иконки и цели использования. Warning Alert используется для предупреждения пользователя о потенциальных угрозах или проблемах, хотя это может и не произойти
Изображение стандартного  Warning Alert:
Изображение  Warning Alert с Header Text по умолчанию:
Изображение  Warning Alert без  Header Text:

Пример:

WarningAlertExample.java
package org.o7planning.javafx.alert;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class WarningAlertExample extends Application {

	// Show a Warning Alert with header Text
	private void showAlertWithHeaderText() {
		Alert alert = new Alert(AlertType.WARNING);
		alert.setTitle("Warning alert");
		alert.setHeaderText("Battery Status:");
		alert.setContentText("The battery charge is low!");

		alert.showAndWait();
	}

	// Show a Warning Alert with default header Text
	private void showAlertWithDefaultHeaderText() {
		Alert alert = new Alert(AlertType.WARNING);
		alert.setTitle("Warning alert");

		// alert.setHeaderText("Battery Status:");
		alert.setContentText("The battery charge is low!");

		alert.showAndWait();
	}

	// Show a Warning Alert without Header Text
	private void showAlertWithoutHeaderText() {
		Alert alert = new Alert(AlertType.WARNING);
		alert.setTitle("Warning alert");

		// Header Text: null
		alert.setHeaderText(null);
		alert.setContentText("The battery charge is low!");

		alert.showAndWait();
	}

	@Override
	public void start(Stage stage) {

		VBox root = new VBox();
		root.setPadding(new Insets(10));
		root.setSpacing(10);

		Button button1 = new Button("Warning Alert");
		Button button2 = new Button("Warning Alert with default Header Text");
		Button button3 = new Button("Warning Alert without Header Text");

		button1.setOnAction(new EventHandler<ActionEvent>() {

			@Override
			public void handle(ActionEvent event) {
				showAlertWithHeaderText();
			}
		});

		button2.setOnAction(new EventHandler<ActionEvent>() {

			@Override
			public void handle(ActionEvent event) {
				showAlertWithDefaultHeaderText();
			}
		});

		button3.setOnAction(new EventHandler<ActionEvent>() {

			@Override
			public void handle(ActionEvent event) {
				showAlertWithoutHeaderText();
			}
		});

		root.getChildren().addAll(button1, button2, button3);

		Scene scene = new Scene(root, 450, 250);
		stage.setTitle("JavaFX Warning Alert (o7planning.org)");
		stage.setScene(scene);

		stage.show();

	}

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

}

4- Error Alert

Error Alert очень похож на  Informtion Alert и Warning Alert, кроме иконки (icon) и цели использования. Error Alert используется для оповещения важной произошедшей проблемы.
Чтобы создать  Error Alert вам нужно использовать  AlertType.ERROR.
* Error Alert *
Alert alert = new Alert(AlertType.ERROR);

alert.setTitle("Error alert");
alert.setHeaderText("Can not add user");
alert.setContentText("The 'abc' user does not exists!");

alert.showAndWait();
На самом деле когда происходит ошибка, вы отображаете  Error Alert чтобы пользователь знал, он включает краткую информацию. И может включать детальную информацию об ошибке, в данном случае вам нужно настроить кастомизированное содержание для Content Region.

Пример:

ErrorAlertExample2.java
package org.o7planning.javafx.alert;

import java.io.PrintWriter;
import java.io.StringWriter;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class ErrorAlertExample2 extends Application {

	private void showError(Exception e) {
		Alert alert = new Alert(AlertType.ERROR);
		alert.setTitle("Error alert");
		alert.setHeaderText(e.getMessage());

		VBox dialogPaneContent = new VBox();

		Label label = new Label("Stack Trace:");

		String stackTrace = this.getStackTrace(e);
		TextArea textArea = new TextArea();
		textArea.setText(stackTrace);

		dialogPaneContent.getChildren().addAll(label, textArea);

		// Set content for Dialog Pane
		alert.getDialogPane().setContent(dialogPaneContent);

		alert.showAndWait();
	}

	private void doSomething() {
		try {
			// An error has occurred here.
			int a = 100 / 0;
		} catch (Exception e) {
			showError(e);
		}
	}

	private String getStackTrace(Exception e) {
		StringWriter sw = new StringWriter();
		PrintWriter pw = new PrintWriter(sw);
		e.printStackTrace(pw);
		String s = sw.toString();
		return s;
	}

	@Override
	public void start(Stage stage) {

		VBox root = new VBox();
		root.setPadding(new Insets(10));
		root.setSpacing(10);

		Button button1 = new Button("Error Alert");

		button1.setOnAction(new EventHandler<ActionEvent>() {

			@Override
			public void handle(ActionEvent event) {
				doSomething();
			}
		});

		root.getChildren().addAll(button1);

		Scene scene = new Scene(root, 450, 250);
		stage.setTitle("JavaFX Error Alert (o7planning.org)");
		stage.setScene(scene);

		stage.show();

	}

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

}

5- Confirmation Alert

Confirmation Alert отображается требуя пользователя подтвердить некоторые действия, которые будут выполнены или не выполнены. По умолчанию  Confirmation Alert у вас будет 2 выбора для пользователя, это  OK или  Cancel.

Пример:

ConfirmationAlertExample.java
package org.o7planning.javafx.alert;

import java.util.Optional;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
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.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class ConfirmationAlertExample extends Application {

   private Label label;

   private void showConfirmation() {

      Alert alert = new Alert(AlertType.CONFIRMATION);
      alert.setTitle("Delete File");
      alert.setHeaderText("Are you sure want to move this file to the Recycle Bin?");
      alert.setContentText("C:/MyFile.txt");

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

      if (option.get() == null) {
         this.label.setText("No selection!");
      } else if (option.get() == ButtonType.OK) {
         this.label.setText("File deleted!");
      } else if (option.get() == ButtonType.CANCEL) {
         this.label.setText("Cancelled!");
      } else {
         this.label.setText("-");
      }
   }

   @Override
   public void start(Stage stage) {

      VBox root = new VBox();
      root.setPadding(new Insets(10));
      root.setSpacing(10);

      this.label = new Label();

      Button button = new Button("Click here to delete file");

      button.setOnAction(new EventHandler<ActionEvent>() {

         @Override
         public void handle(ActionEvent event) {
            showConfirmation();
         }
      });

      root.getChildren().addAll(button, label);

      Scene scene = new Scene(root, 450, 250);
      stage.setTitle("JavaFX Confirmation Alert (o7planning.org)");
      stage.setScene(scene);

      stage.show();

   }

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

}

6- Кастомизировать Button

Alert dialog позволяет вам кастомизировать button отображенные на  Footer Region, ниже приведен пример:

Пример:

ConfirmationAlertExample2.java
package org.o7planning.javafx.alert;

import java.util.Optional;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
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.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class ConfirmationAlertExample2 extends Application {

	private Label label;

	private void showConfirmation() {

		Alert alert = new Alert(AlertType.CONFIRMATION);
		alert.setTitle("Select");
		alert.setHeaderText("Choose the sport you like:");

		ButtonType football = new ButtonType("Football");
		ButtonType badminton = new ButtonType("Badminton");
		ButtonType volleyball = new ButtonType("Volleyball");

		// Remove default ButtonTypes
		alert.getButtonTypes().clear();

		alert.getButtonTypes().addAll(football, badminton, volleyball);

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

		if (option.get() == null) {
			this.label.setText("No selection!");
		} else if (option.get() == football) {
			this.label.setText("You like Football");
		} else if (option.get() == badminton) {
			this.label.setText("You like Badminton");
		} else if (option.get() == volleyball) {
			this.label.setText("You like Volleyball");
		} else {
			this.label.setText("-");
		}
	}

	@Override
	public void start(Stage stage) {

		VBox root = new VBox();
		root.setPadding(new Insets(10));
		root.setSpacing(10);

		this.label = new Label();

		Button button = new Button("Click here to select a Sport");

		button.setOnAction(new EventHandler<ActionEvent>() {

			@Override
			public void handle(ActionEvent event) {
				showConfirmation();
			}
		});

		root.getChildren().addAll(button, label);

		Scene scene = new Scene(root, 450, 250);
		stage.setTitle("JavaFX Confirmation Alert (o7planning.org)");
		stage.setScene(scene);

		stage.show();

	}

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

}