Xử lý File trong Java Swing với JFileChooser

Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu cách nhập một file hay một thư mục trong Java Swing với JFileChooser. JFileChooser là một cách dễ dàng và hiệu quả cho phép hiển thị một hộp thoại cho người dùng để chọn một file hay thư mục trong swing.

Khởi tạo JFileChooser

Có rất nhiều hàm khởi tạo mà JFileChooser cung cấp:

JFileChooser() – Khởi tạo JFileChooser trỏ đến thư mục mặc định của người dùng.

JFileChooser jFileChooser = new JFileChooser();
jFileChooser.showSaveDialog(null);

JFileChooser(String) – Khởi tạo JFileChooser trỏ đến đường dẫn được chỉ định

JFileChooser jFileChooser = new JFileChooser("/Users/nguyenthanhhai/Documents");
jFileChooser.showSaveDialog(null);

JFileChooser(File) – Sử dụng đường dẫn của file được cung cấp.

JFileChooser jFileChooser = new JFileChooser(new File("/Users/nguyenthanhhai/Documents/EBook"));
jFileChooser.showSaveDialog(null);

Và một số constructor khác như:

  • JFileChooser(FileSystemView) – Tạo một JFileChooser trỏ đến đường dẫn dựa vào FileSystemView được cung cấp.
  • JFileChooser(String, FileSystemView) – Tạo một JFileChooser trỏ đến đường dẫn dựa vào FileSystemView và đường dẫn String được cung cấp.
  • JFileChooser(File, FileSystemView) – ạo một JFileChooser trỏ đến đường dẫn dựa vào FileSystemView và File được cung cấp.

Các thao tác cơ bản trên file trong Swing

Ví dụ về cách sử dụng JFileChooser cho người dùng chọn File tại vị trí mà họ muốn sau đó xuất ra màn hình console.

NOTE: Chúng ta có thể sử dụng showSaveDialog() hoặc showOpenDialog() đều được. Tuy nhiên các bạn nên sử dụng 1 trong 2 method trên cho ứng dụng nếu không sẽ khiến người khác cảm thấy rất khó hiểu khi bạn dùng chung 2 method này.

import javax.swing.*;
import javax.swing.filechooser.FileSystemView;
import java.io.File;

class FileChooser {

    public static void main(String[] args) {

        JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());

        int returnValue = jfc.showOpenDialog(null);

        if (returnValue == JFileChooser.APPROVE_OPTION) {
            File selectedFile = jfc.getSelectedFile();
            System.out.println(selectedFile.getAbsolutePath());
        }

    }

}

Output

Hiển thị hộp thoại chọn File

Chọn vào File apache-maven-3.3.9-bin.zip – Màn hình console thông báo như sau:

/Users/nguyenthanhhai/apache-maven-3.3.9-bin.zip

Giới hạn chọn thư mục hoặc chọn file trong JFileChooser

Giả sử có những chức năng mà bạn muốn người dùng chỉ được phép chọn những thư mục thôi thì làm như thế nào nhỉ? Nếu người dùng chọn File thì mất công bạn lại phải thông báo và bỏ qua trường hợp này, như vậy sẽ rất phiền phức cho cả lập trình viên và người dùng.

Chính điều đó, chúng ta có thể giới hạn người dùng chỉ được phép chọn thư mục với JFileChooser.DIRECTORIES_ONLY hay chỉ được chọn File với JFileChooser.FILES_ONLY hay được phép chọn cả 2 với JFileChooser.FILES_AND_DIRECTORIES.

Mặc định khi khởi tạo một JFileChooser nó chỉ cho phép các bạn chọn các File thôi nhé.

Ví dụ dưới đây sẽ tạo một JFileChooser chỉ cho phép người dùng chọn các thư mục.

import javax.swing.JFileChooser;
import javax.swing.filechooser.FileSystemView;

class FileChooser {

    public static void main(String[] args) {

        JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
        jfc.setDialogTitle("Chọn thư mục: ");
        jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

        int returnValue = jfc.showSaveDialog(null);
        if (returnValue == JFileChooser.APPROVE_OPTION) {
            if (jfc.getSelectedFile().isDirectory()) {
                System.out.println("Bạn đã chọn: " + jfc.getSelectedFile());
            }
        }

    }

}

Kết quả các bạn có thể thấy những File sẽ được làm mờ đi báo hiệu rằng bạn không được chọn nó, chỉ có các thư mục hiển thị màu xanh là người dùng được phép chọn.

Sau đó mình chọn thư mục boot và nhấn save. Màn hình console sẽ thông báo như sau:

Bạn đã chọn: /Users/nguyenthanhhai/apache-maven-3.3.9/boot

Chọn nhiều thư mục, tập tin cùng lúc trong Swing

Mặc định thì người dùng chỉ có thể chọn cùng lúc một File hoặc một thư mục cùng lúc. Để cho phép chọn nhiều File/thư mục cùng lúc chúng ta có thể sử dụng hàm setMultiSelectionEnabled(Boolean).

Ví dụ tạo FileChooser cho phép người dùng chọn nhiều File/Thư mục cùng lúc.

 

import javax.swing.*;
import javax.swing.filechooser.FileSystemView;
import java.io.File;
import java.util.Arrays;

class FileChooser {

    public static void main(String[] args) {

        JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
        jfc.setDialogTitle("Chọn nhiều File/Folder:");
        jfc.setMultiSelectionEnabled(true);
        jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);

        int returnValue = jfc.showOpenDialog(null);
        if (returnValue == JFileChooser.APPROVE_OPTION) {
            File[] files = jfc.getSelectedFiles();
            System.out.println("Tìm thấy các thư mục \n");
            Arrays.asList(files).forEach(x -> {
                if (x.isDirectory()) {
                    System.out.println(x.getName());
                }
            });
            System.out.println("\n- - - - - - - - - - -\n");
            System.out.println("Tìm thấy các File \n");
            Arrays.asList(files).forEach(x -> {
                if (x.isFile()) {
                    System.out.println(x.getName());
                }
            });
        }

    }

}

Giới hạn loại File được chọn

Giả sử bạn đang làm ứng dụng xử lý ảnh, khi đó người dùng chỉ được phép thêm các File định dạng ảnh như png, gif vào chương trình. Sẽ thật thuận lợi nếu hộp thoại hiển thị ra chỉ có những File định dạng ảnh phải không nào. Chúng ta sẽ cùng tìm hiểu cách sử dụng FileNameExtensionFilter để làm công việc trên nhé.

import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.filechooser.FileSystemView;

class FileChooser {

    public static void main(String[] args) {

        JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
        jfc.setDialogTitle("Select an image");
        jfc.setAcceptAllFileFilterUsed(false);
        FileNameExtensionFilter filter = new FileNameExtensionFilter("PNG and  GIF images", "png", "gif");
        jfc.addChoosableFileFilter(filter);

        int returnValue = jfc.showOpenDialog(null);
        if (returnValue == JFileChooser.APPROVE_OPTION) {
            System.out.println(jfc.getSelectedFile().getPath());
        }

    }

}

Các bạn có thể thấy chỉ những File định dạng PNG và GIF mới được chọn khi hộp thoại được mở lên.

Sử dụng JFileChooser với showDialog()

Nếu bạn cần tùy chỉnh nút phê duyệt, hãy sử dụng phương thức showDialog (). Dưới đây là một ví dụ về cách sử dụng nó:

import javax.swing.JFileChooser;
import javax.swing.filechooser.FileSystemView;

class FileChooser {

    public static void main(String[] args) {

        JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
        jfc.setDialogTitle("Tuy chinh button");

        int returnValue = jfc.showDialog(null, "Luu nek!");
        if (returnValue == JFileChooser.APPROVE_OPTION) {
            System.out.println(jfc.getSelectedFile().getPath());
        }

    }

}

 

Nguồn tham khảo

https://mkyong.com/swing/java-swing-jfilechooser-example/

https://www.geeksforgeeks.org/java-swing-jfilechooser/

Leave a Comment

Your email address will not be published. Required fields are marked *