2010-05-21 39 views
16

Tôi cảm thấy có một cách đơn giản để thực hiện việc này nhưng tôi không thể tìm ra. Tôi có một JFileChooser cho phép người dùng chọn thư mục. Tôi muốn hiển thị tất cả các tệp trong các thư mục để cung cấp cho người dùng một số ngữ cảnh, nhưng chỉ các thư mục mới được chấp nhận làm lựa chọn (có thể nút Mở sẽ bị tắt khi tệp được chọn). Có cách nào dễ dàng để làm điều này?JFileChooser chọn thư mục nhưng hiển thị các tệp

Trả lời

12

Ghi đè phương thức approvedSelection(). Một cái gì đó như:

JFileChooser chooser = new JFileChooser(new File(".")) 
{ 
    public void approveSelection() 
    { 
     if (getSelectedFile().isFile()) 
     { 
      // beep 
      return; 
     } 
     else 
      super.approveSelection(); 
    } 
}; 
1

AFAIK JFileChooser tách lọc tệp (có thể xem, rất cấu hình) từ bộ lọc lựa chọn (những gì có thể được chọn).

Cấu hình lọc lựa chọn nhiều hạn chế hơn, nhưng AFAIK bạn có thể chọn để cho phép chỉ dirs hoặc chỉ file được lựa chọn với setFileSelectionMode()

-1

Tôi nghĩ rằng giải pháp tốt nhất chỉ là để cho phép người dùng lựa chọn hoặc là một tệp hoặc thư mục. Và nếu người dùng chọn tệp chỉ cần sử dụng thư mục chứa tệp đó.

+0

Thay nghèo UX. –

13

Xem setFileSelectionMode() trong How to Use File Choosers:

setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY) 

Phụ Lục: Hiệu quả có thể được nhìn thấy bằng cách dòng uncommenting 73 của FileChooserDemo này, nhưng nó dường như là nền tảng phụ thuộc.

Phụ Lục: Nếu sử dụng FILES_AND_DIRECTORIES, hãy xem xét việc thay đổi văn bản nút cho phù hợp:

chooser.setApproveButtonText("Choose directory"); 

Như hiệu quả là L & F phụ thuộc, xem xét sử dụng DIRECTORIES_ONLY trên nền tảng đó đã đáp ứng yêu cầu giao diện người dùng của bạn:

if (System.getProperty("os.name").startsWith("Mac OS X")) { 
    chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
} else { 
    chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); 
} 
+0

Nhưng điều đó sẽ ẩn các tập tin, đó là những gì anh ta không muốn. –

+0

@mmyers: Nó hiển thị các tệp có màu xám trong ví dụ được trích dẫn ở trên. YMMV – trashgod

+0

Từ những gì hướng dẫn nói, có vẻ như nó phụ thuộc vào laf. –

17

Giải pháp của tôi là sự hợp nhất giữa các câu trả lời của camickr và trashgod:

final JFileChooser chooser = new JFileChooser() { 
      public void approveSelection() { 
       if (getSelectedFile().isFile()) { 
        return; 
       } else 
        super.approveSelection(); 
      } 
    }; 
    chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); 
+1

+1 Có vẻ như tôi đang ở trong công ty tốt! Tôi đã cập nhật câu trả lời của mình để phản ánh cách tiếp cận kết hợp này. – trashgod

+1

Rất tốt! 'JFileChooser.FILES_AND_DIRECTORIES' là ** quan trọng **! Không có nó, (như trong câu trả lời của 'camickr') giải pháp là ** vô dụng **, như tôi đã thử nghiệm. –

2

Giải pháp ghi đè approveSelection có thể gây phiền toái cho một số người dùng nhất định.

Đôi khi, người dùng chỉ cần nhấp vào tệp trong thư mục mà không có lý do gì (mặc dù cô ấy muốn chọn thư mục chứ không phải tệp đó). Nếu điều đó xảy ra, người dùng sẽ (loại a) bị kẹt trong JFileChooserapproveSelection sẽ không thành công, ngay cả khi cô ấy bỏ chọn tệp đó. Để tránh phiền toái này, đây là những gì tôi làm:

JFileChooser fileChooser = new JFileChooser(); 

fileChooser.setFileSelectionMode(
     JFileChooser.FILES_AND_DIRECTORIES); 

int option = fileChooser.showDialog(null, 
     "Select Directory"); 

if (option == JFileChooser.APPROVE_OPTION) { 
    File f = fileChooser.getSelectedFile(); 
    // if the user accidently click a file, then select the parent directory. 
    if (!f.isDirectory()) { 
     f = f.getParentFile(); 
    } 
    System.out.println("Selected directory for import " + f); 
} 

Chọn thư mục, ngay cả khi người dùng đã chọn một tệp có khả năng sử dụng tốt hơn theo ý kiến ​​của tôi.

0

Giữ fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY) và sử dụng:

File[] selectedFiles = fileChooser.getSelectedFile().listFiles(); 
Các vấn đề liên quan