2011-12-07 14 views
7

Napisałem aplikację Java, która kopiuje ciąg do schowka systemowego. Konstruktor używaJava clipboardOwner Cel?

Clipboard.setContents(Transferable contents, ClipboardOwner owner) 

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

mam to działa dobrze, ale nie jestem pewien, co robi ClipboardOwner? Patrząc na api Java, nie ma zbyt wiele informacji.

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

Co dziwne, nawet przechodząc ClippboardOwner = prace NULL. Więc nie jestem do końca pewien, o co w tym chodzi? Czy ktokolwiek ma jakiś pomysł?

+0

+1 Dobre pytanie. Może Oracle/Java umieściło go na przyszłość, ale często się nad tym zastanawiałem - myślałem, że ma to związek z tym, że w JVM można mieć wiele lokalnych schowków, ale @Sign wydaje się myśleć inaczej ?! – Andy

Odpowiedz

3

Jeśli aplikacja lub jeden z jej elementów implementuje interfejs ClipboardOwner we właściwy sposób, może pokazać, że użytkownik skopiował niektóre dane do schowka systemowego z innej aplikacji lub z innego komponentu własnej aplikacji. See this example.

+1

Innymi słowy, Clipboardowner służy do rejestrowania wywołania zwrotnego dotyczącego zdarzenia utraty własności, czyli zmiany w schowku. Może to być niezawodny sposób monitorowania zdarzenia kopiowania schowka. –

2

Gdy następna osoba umieszcza coś w schowku, właściciel, który podasz do schowka, zostanie poinformowany, że nie znajduje się już w schowku. Istnieje tylko jedna znana implementacja i jest ona pusta zgodnie z this. Wygląda więc jak szczątkowy ogon, który jest po prostu zawieszony.

+0

Jeśli standardowy interfejs API nie ma implementacji, nic nie powstrzyma cię od tworzenia własnych. – MockerTim

+1

Myślę, że powodem, dla którego std lib nie dostarcza żadnych innych implementacji, jest to, że aplikacje będą na ogół wymagały różnych zachowań. Jest tak często w przypadku interfejsów nasłuchujących zdarzenia, np. AncestorListener nie ma żadnych implementacji w std lib. Jest dostarczany w taki sposób, aby std lib mógł wchodzić w interakcje z kodem aplikacji. – allyourcode

+0

Jedna implementacja również nic nie robi, zobacz [źródło] (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). Jest tylko jedna metoda w interfejsie 'ClipboardOwner', a mianowicie' lostOwnership (..) ', i pozostaje pusta przez' StringSelection'. –

0

Przykładowy przypadek użycia to implementacja okna terminala, w której dowolna selekcja jest automatycznie kopiowana do schowka. Wywołanie oddzwaniania lostOwnership(..) może być użyte do odznaczenia, tak aby użytkownik wiedział, że zaznaczenie jest widoczne tylko wtedy, gdy jest aktualnie w schowku. Ten idiom jest używany np. w rxvt (która nie jest napisana w Javie).