کنترل JFileChooser

از کنترل JFileChooser برای کار با فایل ها و پوشه ها استفاده می شود. با استفاده از این کنترل می توان یک فایل یا یک پوشه را از بین لیستی از فایل ها و پوشه ها انتخاب کرد. سازنده این کلاس به روش های زیر مقداردهی می شود :

public JFileChooser()
public JFileChooser(File currentDirectory)
public JFileChooser(File currentDirectory, FileSystemView fileSystemView)
public JFileChooser(FileSystemView fileSystemView)
public JFileChooser(String currentDirectoryPath)
public JFileChooser(String currentDirectoryPath, FileSystemView fileSystemView)

کادر انتخاب یا ذخیره فایل، به وسیله سه متد نمایش داده می شود :

  • ()showDialog
  • ()showOpenDialog
  • ()showSaveDialog

در جدول زیر هم لیست متدهایی که برای سفارشی سازی کادر محاوره ای JfileChooser به کار می روند به همراه کاربرد آنها ذکر شده است :

متد کاربرد
setMultiSelectionEnabled به کاربر اجازه انتخاب همزمان چند فایل یا پوشه را می دهد و دو مقدار true و false می گیرد.
setCurrentDirectory به وسیله این متد می توان پوشه یا درایو پیشفرضی که هنگام باز شدن کادر محاوره ای نمایش داده می شود را مشخص کرد. اگر مقدار null به آن بدهیم بسته به نوع سیستم عامل یک مسیر پیشفرض تعیین می شود که مثلا در ویندوز My Document است.
setFileSelectionMode این متد سه مقدار می گیرد که در حالتی که کاربر اجازه انتخاب چند فایل یا پوشه را دارد کاربر را محدود می کند :

FILES_AND_DIRECTORIES : کاربر اجازه انتخاب همزمان فایل و پوشه را دارد.

FILES_ONLY : کاربر اجازه انتخاب فقط فایل را دارد.

DIRECTORIES_ONLY : کاربر اجازه انتخاب فقط پوشه را دارد.

setFileFilter به وسیله این متد می توان پسوند فایل های قابل نمایش در پنجره را مشخص کرد.
setAcceptAllFileFilterUsed مشخص می کند که گزینه AllFiles در بین لیست پسوندها نمایش داده شود یا نه؟

از متد ()showDialog به همراه یک شیء از کلاس JFileChooser می توان یک کادر محاوره ای سفارشی برای باز یا ذخیره کردن یک فایل ایجاد کرد. این متد دو آرگومان می گیرد که اولین آرگومان کنترل والد و دومین آرگومان عنوان دکمه و کادر را مشخص می کند. برای روشن شدن نحوه استفاده از این متد، کد زیر را در یک فایل با پسوند جاوا نوشته و اجرا کنید :

import javax.swing.*;

public class FrameDemo 
{
    public static void main(String[] args)
    {        
        JFileChooser filechooser = new JFileChooser();
                      
        filechooser.showDialog(null,"Open"); 
    }   
}

نتیجه اجرای کد بالا به صورت زیر است :
jfilechooser-in-java-01
در شکل بالا آرگومان دوم متد ()showDialog هم به جای نام دکمه و هم به جای عنوان پنجره به کار رفته است. حال آرگومان های متد ()showDialog کد بالا را به صورت زیر تغییر دهید :

filechooser.showDialog(null,"Save");

برنامه را اجرا و نتیجه را مشاهده کنید :
jfilechooser-in-java-02
همانطور که احتمالا متوجه شده اید می توان از این متد هم به جای کادر محاوره ای باز و هم به جای کادر محاوره ای ذخیره فایل استفاده کرد. البته کلاس JFileChooser دارای متدی به نام setDialogType می باشد که با دریافت سه مقدار ثابت زیر نوع کادر محاوره ای را مشخص می کند :

  • JFileChooser.OPEN_DIALOG
  • JFileChooser.SAVE_DIALOG
  • JFileChooser.CUSTOM_DIALOG

در کد بالا ما لازم بود که یک عنوان به پنجره و دکمه اختصاص دهیم ولی با استفاده از این متد و ثابت ها به طور خودکار نوع کادر محاوره ای تشخیص داده شده و مقادیری برای دکمه و عنوان اختصاص داده می شود. به کد زیر توجه کنید :

import javax.swing.*;

public class FrameDemo 
{
    public static void main(String[] args)
    {       
        JFileChooser filechooser = new JFileChooser();       
        
        filechooser.setDialogType(JFileChooser.SAVE_DIALOG);

        filechooser.showDialog(null, null);         
    }   
}

در کد بالا مقدار عنوان پنجره و دکمه را null قرار داده ایم ولی چون در خط قبل از آن نوع پنجره را JFileChooser.SAVE_DIALOG را گذاشته ایم در نتیجه عنوان دکمه و پنجره به Save تغییر می کند :
jfilechooser-in-java-03
تشخیص اینکه چه دکمه ای توسط کاربر فشرده شده است بسیار مهم است. متد ()showDialog وقتی که کاربر بر روی دکمه های Open یا Save کلیک می کند مقدار 0 و وقتی بر روی Cancel کلیک می کند، مقدار 1 و اگر خطایی در هنگام کار با کادر محاوره ای رخ دهد مقدار 1- را بر می گرداند. با مقایسه این سه مقدار برگشتی با سه ثابت از کلاس JFileChooser می توان کدهای کارامد تری نوشت :

  • JFileChooser.APPROVE_OPTION
  • CANCEL_OPTION
  • JFileChooser.ERROR_OPTION

به برنامه زیر توجه کنید :

   1: import javax.swing.*;
   2: 
   3: public class FrameDemo 
   4: {
   5:     public static void main(String[] args)
   6:     {       
   7:         final JFileChooser filechooser = new JFileChooser();       
   8:         
   9:         filechooser.setDialogType(JFileChooser.SAVE_DIALOG);
  10:         
  11:         int selectedNumber = filechooser.showDialog(null, null);
  12:         
  13:         switch (selectedNumber)
  14:         {
  15:             case JFileChooser.APPROVE_OPTION : 
  16:                 JOptionPane.showMessageDialog(null, "You Clicked on Open or Save!");
  17:                     break;
  18:             case JFileChooser.CANCEL_OPTION : 
  19:                 JOptionPane.showMessageDialog(null, "You Clicked on Cancel!");
  20:                     break;
  21:             case JFileChooser.ERROR_OPTION : 
  22:                 JOptionPane.showMessageDialog(null, "An error occured !");
  23:                     break;
  24:         }                 
  25:     }   
  26: }

در خط 11 کد بالا مقدار برگشتی از متد را در یک متغیر از نوع صحیح (selectedNumber) قرار داده ایم. سپس همین مقدار را در 15 و 18 و 21 با مقادیر ثابت گفته شده مقایسه کرده و در صورت مساوی بودن ب هر یک از این مقادیر پیغام های مختلفی نمایش داده ایم. حال اجازه دهید که با یک برنامه به شما نحوه استفاده از این کادرها و متدهای آنها را به شما آموزش دهیم. به کد زیر توجه کنید :

   1: import java.io.File;
   2: import javax.swing.*;
   3: import java.awt.event.*;
   4: import javax.swing.filechooser.*;
   5: 
   6: public class FrameDemo 
   7: {
   8:     public static void main(String[] args)
   9:     {
  10:         final JFrame frame = new JFrame("JFileChooser Demo");
  11:         JPanel panel = new JPanel();
  12:         JButton button = new JButton("Open File");
  13:         panel.add(button);
  14:         frame.add(panel);
  15:         
  16:         final JFileChooser filechooser = new JFileChooser();
  17:                       
  18:         button.addActionListener(new ActionListener() 
  19:         { 
  20:             public void actionPerformed(ActionEvent e) 
  21:             {               
  22:                 filechooser.showDialog(null,null);               
  23:             }
  24:         });
  25:          
  26:         frame.setSize(430,315);
  27:         frame.setVisible(true);    
  28:     }   
  29: }

در کد بالا یک دکمه به Panel و Panel را به Frame اضافه کرده ایم (خطوط 14-10). حال می خواهیم با کلیک بر روی دکمه، کادر محاوره ای باز کردن فایل (OpenFileDialog) نمایش داده شود. این کار را در خطوط 24-18 انجام داده ایم. با اجرای برنامه و زدن بر روی دکمه مشاهده می کنید که کادر محاوره ای نمایش داده می شود. از این به بعد کدهایی را که توضیح می دهیم بین خطوط 16 و 18 بنویسید. ابتدا نوع کادر محاوره ای را با استفاده از متد ()setDialogType به صورت زیر مشخص می کنیم :

filechooser.setDialogType(JFileChooser.OPEN_DIALOG);

jfilechooser-in-java-06
مشاهده می کنید که عنوان دکمه و پنجره هر دو Open می باشد. اگر بخواهید عنوان پنجره را تغییر دهید از متد ()setDialogTitle استفاده کنید :

filechooser.setDialogTitle("Open a File");

jfilechooser-in-java-07
فرض کنید که می خواهیم با باز شدن کادر محاوره ای مثلا پوشه Program files درایو C به عنوان پوشه پیشفرض نمایش داده شود. برای این کار ()setCurrentDirectory به صورت زیر استفاده می کنیم :

filechooser.setCurrentDirectory(new File("C:\\Program Files (x86)"));

jfilechooser-in-java-04
اگر بخواهیم کاربر را مجبور به انتخاب یک یا چند فایل بکنیم یعنی کاربر نتواند با گرفتن دکمه Ctrl کیبورد هم پوشه انتخاب کند و هم فایل از کد زیر استفاده می کنیم :

filechooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
filechooser.setMultiSelectionEnabled(true);

در خط اول مقدار JFileChooser.FILES_ONLY را به متد ()setFileSelectionMode ارسال کرده ایم، در نتیجه فقط فایل ها قابل انتخاب هستند و برای حق انتخاب چند فایل هم مقدار true را به متد ()setMultiSelectionEnabled ارسال می کنیم. با اجرای برنامه و گرفتن دکمه Ctrl متوجه می شوید که نمی شود همزمان هم فایل انتخاب کرد و هم پوشه. در حالت پیشفرض تمامی پسوندها در کادر محاوره ای نمایش داده می شود (All files). ولی اگر بخواهیم گزینه های دیگری به کادر محاوره ای اضافه کنیم که مثلا به وسیله آنها فقط فایل های متنی و یا فقط عکس ها نمایش داده شوند از کلاس های FileFilter و FileNameExtensionFilter به صورت زیر برای تعیین پسوندهای دلخواه و اضافه کردن آنها به کادر محاوره ای استفاده می کنید :

FileFilter ImageFiles  = new FileNameExtensionFilter("JPEG file", "jpg", "jpeg");
FileFilter TextFiles   = new FileNameExtensionFilter("Text file", "txt"); 

در کدهای بالا، اولین پارامتر داخل پرانتز توضیحی درباره پسوندها و پارامترهای بعدی هم خود اسم خود پسوندها می باشند. تا اینجا ما فقط پسوندها را مشخص کرده ایم. برای اضافه کردن آنها به کادر محاوره ای از متد ()setFileFilter به صورت زیر استفاده می کنیم :

filechooser.setFileFilter(ImageFiles);
filechooser.setFileFilter(TextFiles);

حال برنامه را اجرا کنید :
jfilechooser-in-java-05
مشاهده می کنید که در جلوی کادر Files of Type دو گروه پسوند دیگر اضافه شده است که با انتخاب هر یک از آنها فقط فایل های با آن پسوند در کادر محاوره ای نمایش داده می شود.