2011-12-07 30 views
7

Tôi đã viết một ứng dụng Java sao chép một chuỗi vào khay nhớ tạm của hệ thống. Các nhà xây dựng sử dụngJava clipboardOwner Mục đích?

Clipboard.setContents(Transferable contents, ClipboardOwner owner) 

http://docs.oracle.com/javase/6/docs/api/java/awt/datatransfer/Clipboard.html

tôi đã nhận nó làm việc tốt nhưng tôi không chắc chắn những gì ClipboardOwner không? Nhìn vào api Java không thực sự nói nhiều thông tin.

http://docs.oracle.com/javase/6/docs/api/java/awt/datatransfer/ClipboardOwner.html

Lạ lùng thay, ngay cả đi qua một ClippboardOwner = công trình null. Vì vậy, tôi không chắc chắn chính xác điểm của nó là gì? Có ai có ý kiến ​​gì không?

+0

+1 Câu hỏi hay. Có lẽ Oracle/Java đã đặt nó vào vị trí cho tương lai, nhưng tôi thường tự hỏi điều này - tôi nghĩ rằng nó đã được làm với thực tế là bạn có thể có nhiều clipboards địa phương trong JVM, nhưng @Sign dường như suy nghĩ khác nhau ?! – Andy

Trả lời

3

Nếu ứng dụng của bạn hoặc một trong các thành phần của nó triển khai giao diện ClipboardOwner theo cách thích hợp, nó có thể cho bạn biết rằng người dùng đã sao chép một số dữ liệu vào khay nhớ tạm thời của hệ thống từ ứng dụng khác hoặc từ một thành phần khác trong ứng dụng của riêng bạn. See this example.

+1

Nói cách khác, Clipboardowner là để đăng ký gọi lại cho quyền sở hữu bị mất sự kiện, đó là, một số thay đổi vào clipboard. Đây có thể là một cách đáng tin cậy để theo dõi sự kiện sao chép clipboard. –

2

Khi người tiếp theo đặt nội dung nào đó vào khay nhớ tạm, chủ sở hữu bạn đưa vào khay nhớ tạm sẽ được thông báo rằng họ không còn trên khay nhớ tạm. Chỉ có một triển khai đã biết và nó trống theo this. Vì vậy, nó trông giống như một cái đuôi di tích mà chỉ là loại treo ra.

+0

Nếu API tiêu chuẩn thiếu triển khai, không có gì ngăn bạn không tự tạo. – MockerTim

+1

Tôi nghĩ rằng lý do mà các std lib không cung cấp bất kỳ triển khai khác là các ứng dụng nói chung sẽ muốn hành vi khác nhau. Đây thường là trường hợp cho giao diện nghe sự kiện, ví dụ: AncestorListener có NO triển khai trong lib std. Nó được cung cấp để lib std có thể tương tác với mã ứng dụng cụ thể. – allyourcode

+0

Việc triển khai một cũng không thực hiện gì, xem [source] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/awt/datatransfer/StringSelection. java # StringSelection.lostOwnership% 28java.awt.datatransfer.Clipboard% 2Cjava.awt.datatransfer.Transferable% 29). Chỉ có một phương thức trong giao diện 'ClipboardOwner', cụ thể là' lostOwnership (..) ', và nó được để trống bởi' StringSelection'. –

0

Ví dụ về trường hợp sử dụng là triển khai cửa sổ đầu cuối, nơi mọi lựa chọn được tự động sao chép vào khay nhớ tạm. Cuộc gọi lại lostOwnership(..) có thể được sử dụng để bỏ chọn, để người dùng biết rằng lựa chọn được hiển thị nếu và chỉ khi nó hiện có trong khay nhớ tạm. Thành ngữ này được sử dụng, ví dụ: trong rxvt (không được viết bằng Java, tuy nhiên).