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

شرح الكلاس FileChooser

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


بناء الكلاس FileChooser

public final class FileChooser
extends Object
	

ملاحظة: الكلاس FileChooser تابع للحزمة javafx.stage و ليس للحزمة javafx.scene.controls كما هو حال باقي العناصر التي شرحناها سابقاً.
لكننا أضفناه في قسم "عناصر واجهة المستخدم" هنا لأنه يعتبر من العناصر المهمة في JavaFX حيث يتيح لك التعامل مباشرةً مع الملفات الموجودة على جهاز المستخدم.



طريقة التعامل مع الكلاس FileChooser

إفتراضياً الـ FileChooser يتيح للمستخدم اختيار و رؤية أي نوع من الملفات الموجودة على جهازه مهما كان نوعها ( MP4 - MP3 - JPG - PNG - TXT الخ.. ) لكنك تستطيع إجبار المستخدم على اختيار أو حفظ أنواع محددة من الملفات من خلال إضافة فلاتر تضيفها على كائن FileChooser. و يمكنك جعل المستخدم قادر على فتح ملف واحد أو فتح عدة ملفات في وقت واحد.

لجعل كائن الـ FileChooser يظهر نافذة خاصة لجعل المستخدم يختار الملف الذي يريد فتحه من التطبيق, قم باستدعاء الدالة الـ showOpenDialog().
لجعل كائن الـ FileChooser يظهر نافذة خاصة لجعل المستخدم يختار الملفات التي يريد فتحها من التطبيق, قم باستدعاء الدالة الـ showOpenMultipleDialog().
لجعل كائن الـ FileChooser يظهر نافذة خاصة لجعل المستخدم يختار الملف الذي يريد فته من التطبيق, قم باستدعاء الدالة الـ showSaveDialog().

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

الجدول التالي يحتوي كونستركتورات الكلاس FileChooser.

الكونستركتور مع تعريفه
public FileChooser() ينشئ كائن من الكلاس FileChooser يمثل نافذة جاهزة و مخصصة تتيح للمستخدم فتح أو حفظ أي نوع من الملفات.

دوال الكلاس FileChooser

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

الدالة مع تعريفها
public final void setTitle(String value) تستخدم لإضافة عنوان لكائن الـ FileChooser الذي قام باستدعائها.
مكان الباراميتر value نمرر نص يمثل العنوان الذي نريد وضعه للـ FileChooser.
public File showOpenDialog(Window ownerWindow) تظهر نافذة منبثقة أمام المستخدم تتيح له تحديد الملف الموجود على حاسوبه و الذي يريد أن يفتحه من التطبيق.
هذه النافذة تحتوي على زر Cancel و زر Open.

مكان الباراميتر ownerWindow نمرر كائن يمثل نافذة التطبيق الحالية التي نريدها أن تنتظر ريثما يقوم المستخدم بإختيار ملف.
أو نضع القيمة null لجعل المستخدم قادر على التعامل مع النافذة المنبثقة و نافذة التطبيق في وقت واحد.

عند إغلاق النافذة المنبثقة فإنها ترجع كائن من الكلاس File يمثل الملف الذي قام المستخدم بتحديده عندما قام بالنقر على الزر Open.
أو ترجع null في حال قام بإغلاق النافذة بدون أن يختار أي ملف.
public List<File> showOpenMultipleDialog(Window ownerWindow) تظهر نافذة منبثقة أمام المستخدم تتيح له تحديد الملف الموجودة على حاسوبه و التي يريد أن يفتحها ليراها فقط من التطبيق.
هذه النافذة تحتوي على زر Cancel و زر Open.

مكان الباراميتر ownerWindow نمرر كائن يمثل نافذة التطبيق الحالية التي نريدها أن تنتظر ريثما يقوم المستخدم بإختيار ملف.
أو نضع القيمة null لجعل المستخدم قادر على التعامل مع النافذة المنبثقة و نافذة التطبيق في وقت واحد.

عند إغلاق النافذة المنبثقة فإنها ترجع كائن من الكلاس List يحتوي على مجموعة كائنات من الكلاس File تمثل الملفات التي قام المستخدم بتحديدها عندما قام بالنقر على الزر Open.
أو ترجع null في حال قام بإغلاق النافذة بدون أن يختار أي ملف.

ترمي الإستثناء UnsupportedOperationException في حال إجراء أي تعديل على ملف موجود في ضمن مجموعة الملفات التي تم إرجاعها.
public File showSaveDialog(Window ownerWindow) تظهر نافذة منبثقة أمام المستخدم تتيح له تحديد مسار و إسم الملف الذي يريد حفظه على حاسوبه.
هذه النافذة تحتوي على زر Cancel و زر Save.

مكان الباراميتر ownerWindow نمرر كائن يمثل نافذة التطبيق الحالية التي نريدها أن تنتظر ريثما يقوم المستخدم بتحديد مسار الملف و إسمه.
أو نضع القيمة null لجعل المستخدم قادر على التعامل مع النافذة المنبثقة و نافذة التطبيق في وقت واحد.

عند إغلاق النافذة المنبثقة فإنها ترجع كائن من الكلاس File يمثل مسار الملف الذي قام المستخدم بحفظه عندما قام النقر على الزر Save.
أو ترجع null في حال قام بإغلاق النافذة و لم يحفظ الملف.
public ObservableList<FileChooser.ExtensionFilter> getExtensionFilters() تستخدم لتحديد إمتداد الملفات ( Files Extension ) التي يستطيع المستخدم إختيارها, أي لإضافة الفلاتر.
فعلياً, هذه الدالة ترجع لك كائن الـ ObservableList الذي يمثل لائحة الفلاتر الخاصة بالكائن FileChooser الذي قام باستدعائها و التي يمكنك من خلالها إضافة فلاتر جديدة.
ملاحظة: أول فلتر تضيفه فيها, يظهر مختاراً بشكل إفتراضي عند إظهار الكائن FileChooser و طبعاً يستطيع المستخدم أن يختار الفيلتر الذي يريده من القائمة.

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


  طريقة إنشاء كائن من الكلاس FileChooser لإظهار File Chooser Dialog 

المثال التالي يعلمك طريقة إنشاء كائن من الكلاس FileChooser لإظهار File Chooser Dialog و معرفة إذا تم النقر على الزر Open أم لا.

مثال طريقة إنشاء كائن من الكلاس FileChooser لإظهار File Chooser Dialog و معرفة إذا تم النقر على الزر Open أم لا.

Main.java
      import java.io.File;
      import javafx.application.Application;
      import javafx.stage.FileChooser;
      import javafx.stage.Stage;

      public class Main extends Application {

      @Override
      public void start(Stage stage) {

      // و الذي يمثل نافذة خاصة تتيح للمستخدم إختيار ملف FileChooser هنا قمنا بإنشاء كائن من الكلاس
      FileChooser fileChooser = new FileChooser();

      // FileChooser هنا قمنا بوضع عنوان للكائن
      fileChooser.setTitle("Open Resource File");

      // لتخزين الملف الذي قد يختاره المستخدم من الحاسوب selectedFile و قمنا بتجهيز الكائن showOpenDialog() بواسطة الدالة fileChooser هنا قمنا بإظهار الكائن
      File selectedFile = fileChooser.showOpenDialog(stage);

      // Open فهذا يعني أن المستخدم قام باختيار ملف على جهازه و نقر على الزر null لا تساوي selectedFile في حال كانت قيمة الكائن
      if( selectedFile != null )
      {
      // هنا من المفترض أن تضع الأوامر التي سيتم تنفيذها في حال قام المستخدم بإختيار ملف ما
      }

      // الأساسي في التطبيق stage حتى لا يظل البرنامج معلقاً بسبب أنه لم يتم إغلاق الـ fileChooser هنا قمنا بإغلاق التطبيق مباشرةً عند إغلاق الـ
      System.exit(0);

      }

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

      }
    

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


  طريقة تحديد نوع الملفات التي يمكنك للمستخدم إختيارها في الـ FileChooser

المثال التالي يعلمك طريقة تحديد نوع الملفات التي يمكنك للمستخدم إختيارها في الـ FileChooser.

  • في حال قام بإختيار النوع Text Files يمكنه فقط رؤية و إختيار الملفات التي نوعها txt.

  • في حال قام بإختيار النوع Java Files يمكنه فقط رؤية و إختيار الملفات التي نوعها java.

  • في حال قام بإختيار النوع Web Files يمكنه فقط رؤية و إختيار الملفات التي نوعها html أو css أو js أو php.

  • في حال قام بإختيار النوع All Files يمكنه رؤية و إختيار أي نوع من الملفات.


مثال يشرح طريقة تحديد نوع الملفات التي يمكنك للمستخدم إختيارها في الـ FileChooser

Main.java
      import java.io.File;
      import javafx.application.Application;
      import javafx.stage.FileChooser;
      import javafx.stage.FileChooser.ExtensionFilter;
      import javafx.stage.Stage;

      public class Main extends Application {

      @Override
      public void start(Stage stage) {

      // و الذي يمثل نافذة خاصة تتيح للمستخدم إختيار ملف FileChooser هنا قمنا بإنشاء كائن من الكلاس
      FileChooser fileChooser = new FileChooser();

      // FileChooser هنا قمنا بوضع عنوان للكائن
      fileChooser.setTitle("Open Resource File");

      // هنا قمنا بتحديد أنواع الملفات التي نريد إظهارها في قائمة تحديد أنواع الملفات التي يمكن للمستخدم إختيارها
      fileChooser.getExtensionFilters().addAll(
      new ExtensionFilter("Text Files", "*.txt"),
      new ExtensionFilter("Java Files", "*.java"),
      new ExtensionFilter("Web Files", "*.html", "*.css", "*.js", "*.php"),
      new ExtensionFilter("All Files", "*.*")
      );

      // لتخزين الملف الذي قد يختاره المستخدم من الحاسوب selectedFile و قمنا بتجهيز الكائن showOpenDialog() بواسطة الدالة fileChooser هنا قمنا بإظهار الكائن
      File selectedFile = fileChooser.showOpenDialog(stage);

      // Open فهذا يعني أن المستخدم قام باختيار ملف على جهازه و نقر على الزر null لا تساوي selectedFile في حال كانت قيمة الكائن
      if( selectedFile != null )
      {
      // هنا من المفترض أن تضع الأوامر التي سيتم تنفيذها في حال قام المستخدم بإختيار ملف ما
      }

      // الأساسي في التطبيق stage حتى لا يظل البرنامج معلقاً بسبب أنه لم يتم إغلاق الـ fileChooser هنا قمنا بإغلاق التطبيق مباشرةً عند إغلاق الـ
      System.exit(0);

      }

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

      }
    

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


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

المثال التالي يعلمك طريقة إظهار FileChooser عند النقر على Button.
بالإضافة إلى طريقة عرض محتوى الملف الذي إختياره المستخدم بواسطة FileChooser في TextArea.

مثال طريقة إظهار FileChooser عند النقر على Button.

Main.java
      import java.io.BufferedReader;
      import java.io.File;
      import java.io.FileReader;
      import java.io.IOException;
      import javafx.application.Application;
      import javafx.scene.Group;
      import javafx.scene.Scene;
      import javafx.scene.control.Alert;
      import javafx.scene.control.Alert.AlertType;
      import javafx.scene.control.Button;
      import javafx.scene.control.TextArea;
      import javafx.stage.FileChooser;
      import javafx.stage.FileChooser.ExtensionFilter;
      import javafx.stage.Stage;

      public class Main extends Application {

      @Override
      public void start(Stage stage) {

      // هنا قمنا بإنشاء جميع الأشياء التي سنضيفها في النافذة
      FileChooser fileChooser = new FileChooser();
      Button button = new Button("Open File");
      TextArea textArea = new TextArea();

      // FileChooser هنا قمنا بوضع عنوان للكائن
      fileChooser.setTitle("Open Resource File");

      // هنا قمنا بتحديد أنواع الملفات التي نريد إظهارها في قائمة تحديد أنواع الملفات التي يمكن للمستخدم إختيارها
      fileChooser.getExtensionFilters().addAll(
      new ExtensionFilter("Text Files", "*.txt"),
      new ExtensionFilter("Java Files", "*.java"),
      new ExtensionFilter("Web Files", "*.html", "*.css", "*.js", "*.php"),
      new ExtensionFilter("All Files", "*.*")
      );

      // هنا قمنا بتحديد مكان ظهور الأشياء التي سنضيفها في النافذة
      button.setTranslateX(20);
      button.setTranslateY(20);
      textArea.setTranslateX(20);
      textArea.setTranslateY(60);

      // هنا قمنا بتحديد حجم جميع الأشياء التي سنضيفها في النافذة
      button.setPrefSize(100, 30);
      textArea.setPrefSize(710, 420);

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

      // root هنا قمنا بإضافة جميع الأشياء في الكائن
      root.getChildren().add(button);
      root.getChildren().add(textArea);

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

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

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

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

      // button هنا قمنا بتحديد ماذا سيحدث عند النقر على الكائن
      button.setOnAction((ActionEvent) -> {
      // لتخزين الملف الذي قد يختاره المستخدم من الحاسوب selectedFile و قمنا بتجهيز الكائن showOpenDialog() بواسطة الدالة fileChooser هنا قمنا بإظهار الكائن
      File selectedFile = fileChooser.showOpenDialog(stage);
      // Open فهذا يعني أن المستخدم قام باختيار ملف على جهازه و نقر على الزر null لا تساوي selectedFile في حال كانت قيمة الكائن
      if (selectedFile != null) {
      // filePath هنا قمنا بحفظ مسار الملف في المتغير
      String filePath = selectedFile.getPath();
      try {
      // text و تجميع كل الأسطر التي يتم قراءتها في الهاية في المتغير line ثم قراءة محتواه سطراً سطراً بشكل مؤقت في المتغير
      BufferedReader br = new BufferedReader(new FileReader(filePath));
      String line = "";
      String text = "";
      while ((line = br.readLine()) != null) {
      text += line + "\n";
      }
      // ثم إغلاق الإتصال مع الملف textArea كنص للـ text في الأخير سيتم وضع النص الذي تم قراءته من الملف و تخزينه في المتغير
      textArea.setText(text);
      br.close();
      }
      catch (IOException ioe) {
      // Alert في حال حدث خطأ سيتم عرضه بداخل
      Alert alert = new Alert(AlertType.INFORMATION);
      alert.setTitle("ERROR");
      alert.setHeaderText("Opps.. There is a problem");
      alert.setContentText(ioe.getMessage());
      alert.show();
      }
      }
      });

      }

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

      }
    

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


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

  طريقة جعل المستخدم قادر على تحديد المكان الذي يريد أن يحفظ فيه الملف بواسطة FileChooser

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

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

Main.java
      import java.io.BufferedWriter;
      import java.io.File;
      import java.io.FileOutputStream;
      import java.io.IOException;
      import java.io.OutputStreamWriter;
      import java.text.DateFormat;
      import java.text.SimpleDateFormat;
      import java.util.Date;
      import javafx.application.Application;
      import javafx.scene.Group;
      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.stage.FileChooser;
      import javafx.stage.FileChooser.ExtensionFilter;
      import javafx.stage.Stage;

      public class Main extends Application {

      @Override
      public void start(Stage stage) {

      // لتحديد الطريقة التي سنعرض بها الوقت على النافذة بعد أن يتم حفظ الملف dateFormat قمنا بتجهيز الكائن
      DateFormat dateFormat = new SimpleDateFormat("dd/MM/Y HH:mm:ss");

      // هنا قمنا بإنشاء جميع الأشياء التي سنضيفها في النافذة
      FileChooser fileChooser = new FileChooser();
      Button button = new Button("Save Now");
      Label label = new Label();
      TextArea textArea = new TextArea();

      // FileChooser هنا قمنا بوضع عنوان للكائن
      fileChooser.setTitle("Save File");

      // هنا قمنا بتحديد أنواع الملفات التي نريد إظهارها في قائمة تحديد أنواع الملفات التي يمكن للمستخدم أن يحفظها من التطبيق
      fileChooser.getExtensionFilters().addAll(
      new ExtensionFilter("Text Files", "*.txt"),
      new ExtensionFilter("Java Files", "*.java"),
      new ExtensionFilter("Web Files", "*.html", "*.css", "*.js", "*.php"),
      new ExtensionFilter("All Files", "*.*")
      );

      // هنا قمنا بتحديد مكان ظهور الأشياء التي سنضيفها في النافذة
      button.setTranslateX(20);
      button.setTranslateY(20);
      label.setTranslateX(140);
      label.setTranslateY(20);
      textArea.setTranslateX(20);
      textArea.setTranslateY(60);

      // هنا قمنا بتحديد حجم جميع الأشياء التي سنضيفها في النافذة
      button.setPrefSize(100, 30);
      label.setPrefSize(500, 30);
      textArea.setPrefSize(710, 420);

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

      // root هنا قمنا بإضافة جميع الأشياء في الكائن
      root.getChildren().add(button);
      root.getChildren().add(label);
      root.getChildren().add(textArea);

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

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

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

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

      // button هنا قمنا بتحديد ماذا سيحدث عند النقر على الكائن
      button.setOnAction((ActionEvent) -> {
      // لتخزين مسار و إسم و نوع الملف الذي يريد أن يحفظه المستخدم file و قمنا بتجهيز الكائن showSaveDialog() بواسطة الدالة fileChooser هنا قمنا بإظهار الكائن
      File file = fileChooser.showSaveDialog(stage);
      // Save فهذا يعني أن المستخدم قام باختيار إسم للملف الذي سيتم حفظه على جهازه و نقر على الزر null لا تساوي file في حال كانت قيمة الكائن
      if (file != null) {
      // filePath هنا قمنا بحفظ مسار الملف في المتغير
      String filePath = file.getPath();
      try {
      // يشير إلى الملف الذي سنكتب البيانات فيه و في حال لم يكن موجوداً, سيتم إنشاءه FileOutputStream هنا قمنا بإنشاء كائن نوعه
      FileOutputStream fos = new FileOutputStream(filePath);
      // BufferedWriter من أجل كائن الـ buffer لوضعه في الـ OutputStreamWriter هنا قمنا بإنشاء كائن نوعه
      OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
      // للكتابة في الملف BufferedWriter هنا قمنا بإنشاء كائن نوعه
      BufferedWriter bw = new BufferedWriter(osw);
      // في الملف textArea هنا قمنا بكتابة كل النص المدخل في الكائن
      bw.write(textArea.getText());
      // هنا قمنا بقطع الإتصال مع الملف و تنظيف الذاكرة
      bw.flush();
      bw.close();
      // هنا قمنا بعرض مسار الملف الذي تم حفظه بالإضافة إلى الوقت الذي تم فيه حفظ الملف
      label.setText(filePath + "  --  Saved Succesfully [ " + dateFormat.format(new Date()) + " ]");
      }
      catch (IOException ioe) {
      // Alert في حال حدث خطأ سيتم عرضه بداخل
      Alert alert = new Alert(AlertType.INFORMATION);
      alert.setTitle("ERROR");
      alert.setHeaderText("Opps.. There is a problem");
      alert.setContentText(ioe.getMessage());
      alert.show();
      }
      }
      });

      }

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

      }
    

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

طريقة جعل المستخدم قادر على تحديد المكان الذي يريد أن يحفظ فيه الملف بواسطة FileChooser

أفضل موقع  تعلم javaFX