Chúc mừng đến Ưu điểm Swing, đây là câu hỏi hay (tôi hy vọng) cho bạn.thay đổi hành vi của JFileChooser: ngăn chặn "chọn" khi nhập vào đường dẫn tệp JTextField
Dưới đây là các yêu cầu công việc và giải pháp có thể tôi thấy. Tôi muốn một người có trải nghiệm như vậy để chia sẻ một số suy nghĩ về điều này.
này không yêu cầu mã hóa hoặc bất cứ điều gì như thế, tôi chỉ cần lời khuyên chung như mà cách tiếp cận đáng tin cậy hơn về thực tế, tôi cần phải làm việc với tin những biểu tượng mà cư trú tại sun.swing và/hoặc các gói javax.swing.plaf.
Nhiệm vụ là sửa đổi/thay đổi hành vi JFileChooser (chỉ một chút, thực sự).
khi người dùng nhấn enter vào tên tệp JTextField và trường có chứa đường dẫn đến thư mục, không "chọn" thư mục, nhưng chuyển sang thư mục thay thế. Có, hộp thoại được định cấu hình để chấp nhận thư mục, nhưng chúng tôi chỉ cần chấp nhận các nhấp chuột vào nút "Mở" và (có thể) nhấp đúp vào bảng danh sách tệp.
ngăn chặn người dùng từ lựa chọn một thư mục/tập tin với hơn dữ liệu 1GB qua đánh nhập vào tên tập tin văn bản lĩnh vực
Here're vài lựa chọn giải pháp chung:
a. lắng nghe các thay đổi dựa trên thuộc tính mà JFileChooser cung cấp (mà AFAICS được kích hoạt sau khi thực tế và sẽ không cung cấp mức độ kiểm soát chúng ta cần ở đây).
b. tinker với javax.swing.plaf.basic.BasicFileChooserUI (thông qua refrection, phá vỡ đóng gói riêng tư cao nhất) và thay đổi tham chiếu đến
private Action approveSelectionAction = new ApproveSelectionAction();
để hành động tùy chỉnh của chúng tôi không kiểm tra thêm cho 1 và 2. Đây liên kết tiếp cận với gói plaf và có thể không thành công trong trường hợp hành động này bằng cách nào đó bị ghi đè trong một số lớp bên dưới lớp UI này.
c. đi ngang qua phân cấp thành phần JFileChooser, tìm JTextField (mà dường như chỉ xuất hiện một lần trong cây thành phần), trang trí tất cả các trình lắng nghe hành động treo trên JTextField đó bằng các kiểm tra tùy chỉnh của chúng ta. Phiên gỡ lỗi của tôi cho thấy rằng JTextField này là một số phân lớp ẩn danh của JTextField đang sống trong sun.swing.FilePane. Cách tiếp cận này dường như thân thiện với OO hơn, nhưng có một cơ hội cho một số hệ điều hành trường văn bản này vắng mặt, hoặc một số JTextField khác cũng có mặt trong hệ thống phân cấp. Vâng, có vẻ như API JFileChooser công cộng sẽ không đủ để đạt được hành vi đó, trong khi hai tùy chọn còn lại là ma thuật sâu hoặc không thể chuyển đổi (dài hạn), hoặc thậm chí cả hai.
Vì vậy, câu hỏi đặt ra là: bạn sẽ chọn phương pháp nào và tại sao?
Oh me dumbo, tôi sẽ kiểm tra và báo cáo lại với những phát hiện của tôi. –
Vâng vâng, tôi đã khá có thể đánh chặn và giải giáp sự kiện lựa chọn phê duyệt bằng cách không gọi super.approveSelection() trong một số trường hợp đáng lẽ phải được coi là không hợp lệ. Đó là một giải pháp khá tốt, cảm ơn một lần nữa. –