کنترل 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"); } }
نتیجه اجرای کد بالا به صورت زیر است :
در شکل بالا آرگومان دوم متد ()showDialog هم به جای نام دکمه و هم به جای عنوان پنجره به کار رفته است. حال آرگومان های متد ()showDialog کد بالا را به صورت زیر تغییر دهید :
filechooser.showDialog(null,"Save");
برنامه را اجرا و نتیجه را مشاهده کنید :
همانطور که احتمالا متوجه شده اید می توان از این متد هم به جای کادر محاوره ای باز و هم به جای کادر محاوره ای ذخیره فایل استفاده کرد. البته کلاس 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 تغییر می کند :
تشخیص اینکه چه دکمه ای توسط کاربر فشرده شده است بسیار مهم است. متد ()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);
مشاهده می کنید که عنوان دکمه و پنجره هر دو Open می باشد. اگر بخواهید عنوان پنجره را تغییر دهید از متد ()setDialogTitle استفاده کنید :
filechooser.setDialogTitle("Open a File");
فرض کنید که می خواهیم با باز شدن کادر محاوره ای مثلا پوشه Program files درایو C به عنوان پوشه پیشفرض نمایش داده شود. برای این کار ()setCurrentDirectory به صورت زیر استفاده می کنیم :
filechooser.setCurrentDirectory(new File("C:\\Program Files (x86)"));
اگر بخواهیم کاربر را مجبور به انتخاب یک یا چند فایل بکنیم یعنی کاربر نتواند با گرفتن دکمه 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);
حال برنامه را اجرا کنید :
مشاهده می کنید که در جلوی کادر Files of Type دو گروه پسوند دیگر اضافه شده است که با انتخاب هر یک از آنها فقط فایل های با آن پسوند در کادر محاوره ای نمایش داده می شود.
مفید بود 🙂
نه برنامه رو که run می کنم اصلا فرم رو نمی سازه… وقتی خط های مربوط به jfilechooser رو کامنت می کنم دکمه open رو تو فرم نشون میده اما وقتی آنکامنت می کنم اصلا نمی سازدش
سلام من jdk1.5 دارم و تازه میخوام تو یه بخشی از برنامه ام jfilechooser استفاده کنم… سیستم عاملم xp هستش که روی vmware نصب شده و یه درایو c داره و یه درایو share شده از os اصلیم که win 10 هستش….
ولی وقتی به خط final JFileChooser filechooser = new JFileChooser(); می رسم خطای زیر رو میده:
Exception: java.security.AccessControlException: access denied (java.util.PropertyPermission user.dir read)
تو اینترنت سرچ کردم حتی فایل policy رو هم تغییر دادم اما فایده ای نداره….
نظری دارید در مورد این مشکل؟
سلام، یعنی برنامه اجرا میشه و بعد که میخواین یه فایل انتخاب کنید این خطا رو میده؟