شرح الكلاس Alert في javafx

شرح  الكلاس Alert   

الكلاس Alert يستخدم لإظهار نافذة ثانوية ( Dialog ) جاهزة أمام المستخدم.
في العادة نستخدم نوافذ ثانوية في التطبيقات لأسباب عديدة منها: لتحذير المستخدم أو إعلامه بشيء ما, لسؤاله إذا كان موافقاً على أمر ما أم لا, لنطلب منه إدخال معلومة ما, لنطلب منه تسجيل الدخول, لإظهار نتيجة عملية بحث ما إلخ..


مصطلحات تقنية Alert

في البداية عليك معرفة أنه لتحديد نوع النافذة التي ستظهر, فإننا نستخدم إحدى الثوابت الموجودة في الكلاس AlertType.

بالنسبة للنوافذ التي يمكن إظهارها للمستخدم فإنه يطلق عليها التسميات التالية:

المصطلح معناه
Information Dialog عبارة عن نافذة منبثقة تستخدم لإعلام المستخدم بشيء ما, و البعض يسميها Message Dialog.
لإظهار نافذة من هذا النوع يجب تمرير الثابت AlertType.INFORMATION في كونستركتور الكائن Alert.
Warning Dialog عبارة عن نافذة منبثقة تستخدم لتنبيه المستخدم حول أمر ما.
لإظهار نافذة من هذا النوع يجب تمرير الثابت AlertType.WARNING في كونستركتور الكائن Alert.
Error Dialog عبارة عن نافذة منبثقة تستخدم لتنبيه المستخدم حول وجود خطأ.
لإظهار نافذة من هذا النوع يجب تمرير الثابت AlertType.ERROR في كونستركتور الكائن Alert.
Confirmation Dialog عبارة عن نافذة منبثقة تستخدم لسؤال المستخدم إذا كان موافقاً على شيء ما أم لا.
لإظهار نافذة من هذا النوع يجب تمرير الثابت AlertType.CONFIRMATION في كونستركتور الكائن Alert.


طريقة التعامل مع Alert

في حال أردنا إظهار نافذة ثانوية فيجب أن نفعل التالي:

  1. نقوم بإنشاء كائن من الكلاس Alert, و في الكونستركتور نمرر ثابت من الكلاس AlertType لنحدد نوع النافذة التي نريد إظهارها.

  2. نستدعي الدالة setTitle() من الكائن Alert لوضع عنوان في Stage النافذة.

  3. نستدعي الدالة setHeaderText() من الكائن Alert لوضع عنوان رئيسي بداخل النافذة و الذي سيظهر بأحرف كبيرة.

  4. نستدعي الدالة setContentText() من الكائن Alert لوضع النص الذي سيظهر في النافذة بأحرف صغيرة.

  5. لإظهار النافذة نستدعي الدالة show() أو showAndWait() من الكائن Alert و ستعرف لاحقاً ما هو الفرق بينهما.



بناء الكلاس Alert

public class Alert
extends Dialog<ButtonType>
	

مكونات الـ Alert

النافذة التي نحصل عليها بواسطة الكلاس Alert تتألف من 4 أجزاء أساسية كما في الصورة التالية.
و جميع هذه الأجزاء في الواقع موضوعة في كائن من كلاس إسمه DialogPane.


alert window structure

أشكال الـ Alert

المثال التالي يظهر 4 أشكال مختلفة من النوافذ التي يمكن الحصول عليها بواسطة الكلاس Alert.
فعلياً, عند تشغيل البرنامج سيظهر لك Alert Information. عند إغلاقه سيظهر لك Alert Warning. عند إغلاقه سيظهر لك Alert Error. عند إغلاقه سيظهر لك Alert Confirmation.

مثال

Main.java
import javafx.application.Application;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.stage.Stage;
 
public class Main extends Application {
 
    @Override
    public void start(Stage stage) {
		
		// مع تحديد محتواه و من ثم قمنا بإظهاره INFORMATION حددنا أنه يمثل نافذة من النوع Alert هنا قمنا بإنشاء كائن من الكلاس
        Alert alertInformation = new Alert(AlertType.INFORMATION);
        alertInformation.setTitle("Information Alert Title");
        alertInformation.setHeaderText("Information Alert Header");
        alertInformation.setContentText("Information Alert Content \nWhich can appears on multi-line if needed");
    	alertInformation.showAndWait();
		
		// مع تحديد محتواه و من ثم قمنا بإظهاره WARNING حددنا أنه يمثل نافذة من النوع Alert هنا قمنا بإنشاء كائن من الكلاس
        Alert alertWarning = new Alert(AlertType.WARNING);
        alertWarning.setTitle("Warning Alert Title");
        alertWarning.setHeaderText("Warning Alert Header");
        alertWarning.setContentText("Warning Alert Content \nWhich can appears on multi-line if needed");
    	alertWarning.showAndWait();
		
		// مع تحديد محتواه و من ثم قمنا بإظهاره ERROR حددنا أنه يمثل نافذة من النوع Alert هنا قمنا بإنشاء كائن من الكلاس
        Alert alertError = new Alert(AlertType.ERROR);
        alertError.setTitle("Error Alert Title");
        alertError.setHeaderText("Error Alert Header");
        alertError.setContentText("Error Alert Content \nWhich can appears on multi-line if needed");
    	alertError.showAndWait();
		
		// مع تحديد محتواه و من ثم قمنا بإظهاره CONFIRMATION حددنا أنه يمثل نافذة من النوع Alert هنا قمنا بإنشاء كائن من الكلاس
        Alert alertConfirmation = new Alert(AlertType.CONFIRMATION);
        alertConfirmation.setTitle("Confirmation Alert Title");
        alertConfirmation.setHeaderText("Confirmation Alert Header");
        alertConfirmation.setContentText("Confirmation Alert Content \nWhich can appears on multi-line if needed");
    	alertConfirmation.showAndWait();
		
    }
 
    // هنا قمنا بتشغيل التطبيق
    public static void main(String[] args) {
        launch(args);
    }
 
}
		

ستظهر لك النافذة التالية عند التشغيل.

بمجرد أن تغلق النافذة السابقة, ستظهر لك النافذة التالية عند التشغيل.

بمجرد أن تغلق النافذة السابقة, ستظهر لك النافذة التالية عند التشغيل.

بمجرد أن تغلق النافذة السابقة, ستظهر لك النافذة التالية عند التشغيل.



ملاحظة

لو استخدمنا الدالة show() بدلاً من الدالة showAndWait() عند إظهار النوافذ لظهروا كلهم في وقت واحد مع إمكانية التعامل مع نافذة واحدة في كل مرة.


معلومة تقنية

تستطيع إضافة أنواع أزرار أخرى في النافذة في المنطقة التي يقال لها Footer Region بشرط أن لا تكون النافذة أصلاً تحتوي على هذا النوع من الأزرار.
فمثلاً لا تستطيع وضع زرين Open في النافذة. لا تقلق لأن هذا الأمر ستراه لاحقاً في الأمثلة ضمن المثال الثاني بالتحديد.

كونستركتورات الكلاس Alert

الجدول التالي يحتوي على كونستركتورات الكلاس Alert.

الكونستركتور مع تعريفه
Alert(Alert.AlertType alertType) ينشئ كائن من الكلاس Alert يمثل نافذة ثانوية ( Dialog ) لها نوع محدد.
مكان الباراميتر alertType نمرر إحدى ثوابت الكلاس AlertType التي تمثل نوع الأيقونة و الأزرار التي ستظهر في النافذة.
Alert(Alert.AlertType alertType, String contentText, ButtonType... buttons) ينشئ كائن من الكلاس Alert يمثل نافذة ثانوية ( Dialog ) لها نوع محدد.
  • مكان الباراميتر alertType نمرر إحدى ثوابت الكلاس AlertType التي تمثل نوع الأيقونة و الأزرار التي ستظهر في النافذة.

  • مكان الباراميتر contentText نمرر النص الذي نريده أن يظهر في النافذة في المكان الذي يقال له Header Region.

  • مكان الباراميتر buttons نمرر ثابت أو أكثر من الكلاس ButtonType لإضافة أزرار أخرى في أسفل النافذة في المكان الذي يقال له Footer Region.

دوال الكلاس Alert

الجدول التالي يحتوي على دوال الكلاس Alert الأكثر إستخداماً.

الدالة مع تعريفها
public final void setTitle(String title) تستخدم لتحديد عنوان لكائن الـ Alert الذي قام باستدعائها, و الذي سيظهر في المنطقة التي يقال لها Title Region.
مكان الباراميتر title نمرر النص الذي نريد وضعه.
public final void setHeaderText(String headerText) تستخدم لتحديد النص الذي سيظهر بجانب الأيقونة في كائن الـ Alert الذي قام باستدعائها, و الذي سيظهر في المنطقة التي يقال لها Header Region.
مكان الباراميتر headerText نمرر النص الذي نريد وضعه.
public final void setContentText(String contentText) تستخدم لتحديد النص الذي سيظهر فوق الأزرار في كائن الـ Alert الذي قام باستدعائها, و الذي سيظهر في المنطقة التي يقال لها Content Region.
مكان الباراميتر contentText نمرر النص الذي نريد وضعه.
public final void show() تستخدم لإظهار كائن الـ Alert الذي قام باستدعائها و هي لا ترجع قيمة.
لذلك في حال كنت تريد إظهار أكثر من نافذة وراء بعض فلا تقم باستخدام هذه الدالة لأنها ستفتح كل النوافذ مع بعض.
public final Optional<ButtonType> showAndWait() تستخدم لإظهار كائن الـ Alert الذي قام باستدعائها و تنتظر المستخدم حتى يغلقها لترجع قيمة تمثل نوع الزر الذي تم النقر عليه حتى تم إغلاقها.
نوع الزر الذي ترجعه عبارة عن إحدى الثوابت الموجودة في الكلاس ButtonType.
public final void setResizable(boolean resizable) تستخدم لجعل المستخدم قادر على تكبير أو تصغير حجم كائن الـ Alert الذي قام باستدعائها.
مكان الباراميتر resizable نمرر لها القيمة true إذا أردنا جعل المستخدم قادر على تكبير أو تصغير حجم كائن الـ Alert.
public final ButtonType getResult() ترجع ثابت من الكلاس ButtonType و نوعه أيضاً ButtonType يمثل نوع الزر الذي تم النقر عليه حتى تم إغلاق كائن الـ Alert الذي قام باستدعائها.
public final void setStyle(String value) تستخدم لتعديل تصميم كائن الـ Alert الذي قام بإستدعائها.
مكان الباراميتر value يمكنك تمرير إسم و قيمة أي خاصية تريد تعديلها في كائن الـ Alert بأسلوب لغة CSS لإظهاره بالشكل الذي تريده.

أمثلة شاملة في الكلاس Alert 


 طريقة إظهار Alert عند النقر على Button

المثال التالي يعلمك طريقة إظهار Alert عند النقر على Button.
كل Button يظهر Alert مختلف عند النقر عليه.

مثال

Main.java
      import javafx.application.Application;
      import javafx.scene.Scene;
      import javafx.stage.Stage;
      import javafx.scene.Group;
      import javafx.scene.control.Alert;
      import javafx.scene.control.Alert.AlertType;
      import javafx.scene.control.Button;

      public class Main extends Application {

      @Override
      public void start(Stage stage) {

      // هنا قمنا بإنشاء جميع الأشياء التي سنضيفها في النافذة
      Button button1 = new Button("Show Information Alert");
      Button button2 = new Button("Show Warning Alert");
      Button button3 = new Button("Show Error Alert");
      Button button4 = new Button("Show Confirmation Alert");

      // هنا قمنا بتحديد حجم الأشياء التي سنضيفها في النافذة
      button1.setPrefSize(200, 30);
      button2.setPrefSize(200, 30);
      button3.setPrefSize(200, 30);
      button4.setPrefSize(200, 30);

      // هنا قمنا بتحديد مكان ظهور الأشياء التي سنضيفها في النافذة
      button1.setTranslateX(100);
      button1.setTranslateY(55);
      button2.setTranslateX(100);
      button2.setTranslateY(95);
      button3.setTranslateX(100);
      button3.setTranslateY(135);
      button4.setTranslateX(100);
      button4.setTranslateY(175);

      // في النافذة Root Node لأننا ننوي جعله الـ Group هنا قمنا بإنشاء كائن من الكلاس
      Group root = new Group();

      // root في الكائن slider هنا قمنا بإضافة الكائن
      root.getChildren().add(button1);
      root.getChildren().add(button2);
      root.getChildren().add(button3);
      root.getChildren().add(button4);

      // فيها و تحديد حجمها Node كأول root هنا قمنا بإنشاء محتوى النافذة مع تعيين الكائن
      Scene scene = new Scene(root, 400, 250);

      // هنا وضعنا عنوان للنافذة
      stage.setTitle("JavaFX Alert");

      // أي وضعنا محتوى النافذة الذي قمنا بإنشائه للنافذة .stage في كائن الـ scene هنا وضعنا كائن الـ
      stage.setScene(scene);

      // هنا قمنا بإظهار النافذة
      stage.show();

      // button1 هنا قمنا بتحديد ماذا سيحدث عند النقر على الزر
      button1.setOnAction((Action) -> {
      // مع تحديد محتواه و من ثم قمنا بإظهاره INFORMATION حددنا أنه يمثل نافذة من النوع Alert هنا قمنا بإنشاء كائن من الكلاس
      Alert alertInformation = new Alert(AlertType.INFORMATION);
      alertInformation.setTitle("Information Alert Title");
      alertInformation.setHeaderText("Information Alert Header");
      alertInformation.setContentText("Information Alert Content \nWhich can appears on multi-line if needed");
      alertInformation.showAndWait();
      });

      // button2 هنا قمنا بتحديد ماذا سيحدث عند النقر على الزر
      button2.setOnAction((Action) -> {
      // مع تحديد محتواه و من ثم قمنا بإظهاره WARNING حددنا أنه يمثل نافذة من النوع Alert هنا قمنا بإنشاء كائن من الكلاس
      Alert alertWarning = new Alert(AlertType.WARNING);
      alertWarning.setTitle("Warning Alert Title");
      alertWarning.setHeaderText("Warning Alert Header");
      alertWarning.setContentText("Warning Alert Content \nWhich can appears on multi-line if needed");
      alertWarning.showAndWait();
      });

      // button3 هنا قمنا بتحديد ماذا سيحدث عند النقر على الزر
      button3.setOnAction((Action) -> {
      // مع تحديد محتواه و من ثم قمنا بإظهاره ERROR حددنا أنه يمثل نافذة من النوع Alert هنا قمنا بإنشاء كائن من الكلاس
      Alert alertError = new Alert(AlertType.ERROR);
      alertError.setTitle("Error Alert Title");
      alertError.setHeaderText("Error Alert Header");
      alertError.setContentText("Error Alert Content \nWhich can appears on multi-line if needed");
      alertError.showAndWait();
      });

      // button4 هنا قمنا بتحديد ماذا سيحدث عند النقر على الزر
      button4.setOnAction((Action) -> {
      // مع تحديد محتواه و من ثم قمنا بإظهاره CONFIRMATION حددنا أنه يمثل نافذة من النوع Alert هنا قمنا بإنشاء كائن من الكلاس
      Alert alertConfirmation = new Alert(AlertType.CONFIRMATION);
      alertConfirmation.setTitle("Confirmation Alert Title");
      alertConfirmation.setHeaderText("Confirmation Alert Header");
      alertConfirmation.setContentText("Confirmation Alert Content \nWhich can appears on multi-line if needed");
      alertConfirmation.showAndWait();
      });

      }

      // هنا قمنا بتشغيل التطبيق
      public static void main(String[] args) {
      launch(args);
      }

      }
    

ستظهر لك النافذة التالية عند التشغيل.

كل زر يظهر Message Dialog مختلف في المحتوى و الأيقونة.



 طريقة تحديد أنواع الأزرار التي تريدها أن تظهر في الـ Alert

المثال التالي يعلمك طريقة تحديد أنواع الأزرار التي تريدها أن تظهر في الـ Alert.
إضافةً إلى ذلك ستتعلم كيف تنفذ أوامر معينة بناءاً على كل زر موجود في الـ Alert في حال قام المستخدم بالنقر عليه.

مثال

Main.java
      import javafx.application.Application;
      import javafx.scene.Scene;
      import javafx.stage.Stage;
      import javafx.scene.Group;
      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.paint.Color;

      public class Main extends Application {

      @Override
      public void start(Stage stage) {

      // هنا قمنا بإنشاء جميع الأشياء التي سنضيفها في النافذة
      Button button1 = new Button("Delete your history");
      Button button2 = new Button("Exit");
      Label label = new Label();

      // label هنا قمنا بتحسين تصميم الكائن
      label.setStyle("-fx-font-size: 15px;"
      + "-fx-font-weight: bold;"Ti
      + "-fx-alignment: center;");

      // هنا قمنا بتحديد حجم الأشياء التي سنضيفها في النافذة
      button1.setPrefSize(200, 30);
      button2.setPrefSize(200, 30);
      label.setPrefSize(200, 30);

      // هنا قمنا بتحديد مكان ظهور الأشياء التي سنضيفها في النافذة
      button1.setTranslateX(100);
      button1.setTranslateY(75);
      button2.setTranslateX(100);
      button2.setTranslateY(115);
      label.setTranslateX(100);
      label.setTranslateY(175);

      // في النافذة Root Node لأننا ننوي جعله الـ Group هنا قمنا بإنشاء كائن من الكلاس
      Group root = new Group();

      // root في الكائن slider هنا قمنا بإضافة الكائن
      root.getChildren().add(button1);
      root.getChildren().add(button2);
      root.getChildren().add(label);

      // فيها و تحديد حجمها Node كأول root هنا قمنا بإنشاء محتوى النافذة مع تعيين الكائن
      Scene scene = new Scene(root, 400, 250);

      // هنا وضعنا عنوان للنافذة
      stage.setTitle("JavaFX Alert");

      // أي وضعنا محتوى النافذة الذي قمنا بإنشائه للنافذة .stage في كائن الـ scene هنا وضعنا كائن الـ
      stage.setScene(scene);

      // هنا قمنا بإظهار النافذة
      stage.show();

      // button1 هنا قمنا بتحديد ماذا سيحدث عند النقر على الزر
      button1.setOnAction((Action) -> {
      // مع تحديد محتواه CONFIRMATION حددنا أنه يمثل نافذة من النوع Alert هنا قمنا بإنشاء كائن من الكلاس
      Alert alert = new Alert(AlertType.CONFIRMATION);
      alert.setTitle("Delete History");
      alert.setHeaderText("Delete History");
      alert.setContentText("You are going to delete you history.\nAre you sure?");

      // مع مراقبة أي تفاعل يجريه المستخدم معها alert هنا قمنا بإظهار النافذة التي يمثلها الكائن
      alert.showAndWait().ifPresent(response -> {
      // OK أزرق في حال تم النقر على الزر label هنا قلنا أنه سيتم جعل لون خط الكائن
      if (response == ButtonType.OK) {
      label.setTextFill(Color.BLUE);
      }
      // أحمر في حال تم النقر على أي زر آخر فيها label هنا قلنا أنه سيتم جعل لون خط الكائن
      else {
      label.setTextFill(Color.RED);
      }
      });

      // Label الذي سينقر عليه المستخدم كنص للكائن Button هنا قمنا بوضع إسم الـ
      label.setText(alert.getResult().getText());
      });

      // button3 هنا قمنا بتحديد ماذا سيحدث عند النقر على الزر
      button2.setOnAction((Action) -> {
      // مع تحديد محتواه Warning حددنا أنه يمثل نافذة من النوع Alert هنا قمنا بإنشاء كائن من الكلاس
      Alert alert = new Alert(AlertType.WARNING);
      alert.setTitle("Warning");
      alert.setHeaderText("Warning");
      alert.setContentText("Save changes before closing?");

      // alert و الذي كان في الأصل موجود في الكائن Ok الذي إسمه Button على الـ Button هنا قمنا بإضافة إثنين
      alert.getButtonTypes().add(ButtonType.NO);
      alert.getButtonTypes().add(ButtonType.CANCEL);

      // مع مراقبة أي تفاعل يجريه المستخدم معها alert هنا قمنا بإظهار النافذة التي يمثلها الكائن
      alert.showAndWait().ifPresent(response -> {
      // OK هنا قلنا أنه سيتم إغلاق التطبيق بالكامل في حال تم النقر على الزر
      if (response == ButtonType.OK)
      {
      System.exit(0);
      }
      // No أحمر في حال تم النقر على الزر label هنا قلنا أنه سيتم جعل لون خط الكائن
      else if(response == ButtonType.NO)
      {
      label.setTextFill(Color.RED);
      }
      // Cancel أحمر في حال تم النقر على الزر label هنا قلنا أنه سيتم جعل لون خط الكائن
      else if(response == ButtonType.CANCEL)
      {
      label.setTextFill(Color.BROWN);
      }
      });

      // Label الذي سينقر عليه المستخدم كنص للكائن Button هنا قمنا بوضع إسم الـ
      label.setText(alert.getResult().getText());
      });

      }

      // هنا قمنا بتشغيل التطبيق
      public static void main(String[] args) {
      launch(args);
      }

      }
    

ستظهر لك النافذة التالية عند التشغيل.

كل زر يظهر Message Dialog مختلف في المحتوى و الأيقونة.


كورس تعلم  javaFX