2011-12-07 22 views
7

Escribí una aplicación Java que copia una cadena en el portapapeles del sistema. El constructor utilizaPortapapeles Java ¿Propósito del propietario?

Clipboard.setContents(Transferable contents, ClipboardOwner owner) 

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

lo tengo funcionando bien, pero no estoy seguro de lo que hace el ClipboardOwner? En cuanto a la API de Java realmente no dice mucha información.

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

Por extraño que parezca, incluso pasando un ClippboardOwner = obras nulos. Entonces, ¿no estoy seguro de cuál es el sentido? ¿Alguien tiene alguna idea?

+0

+1 Buena pregunta. Tal vez Oracle/Java lo haya implementado para el futuro, pero a menudo me lo he preguntado. Pensé que tenía que ver con el hecho de que puedes tener muchos portapapeles locales en la JVM, pero @Sign parece pensar de manera diferente. – Andy

Respuesta

3

Si su aplicación, o uno de sus componentes implementa la interfaz ClipboardOwner de manera adecuada, puede mostrarle que el usuario copió algunos datos al portapapeles del sistema desde otra aplicación o desde otro componente de su propia aplicación. See this example.

+1

En otra palabra, Clipboardowner es para registrar la devolución de llamada para el evento de pérdida de propiedad, es decir, algunos cambios en el portapapeles. Esta puede ser una forma confiable de monitorear el evento de copia del portapapeles. –

2

Cuando la siguiente persona pone algo en el portapapeles, al propietario que le entregue al portapapeles se le informará que ya no está en el portapapeles. Solo hay una implementación conocida y está vacía de acuerdo con this. Entonces parece una cola vestigial que simplemente está colgando.

+0

Si la API estándar carece de implementaciones, nada le impide hacer la suya propia. – MockerTim

+1

Creo que la razón por la que el estándar lib no proporciona ninguna otra implementación es que las aplicaciones generalmente querrán comportamientos diferentes. Este es a menudo el caso de las interfaces de escucha de eventos, p. AncestorListener NO tiene implementaciones en la biblioteca estándar. Se proporciona para que std lib pueda interactuar con el código específico de la aplicación. – allyourcode

+0

La única implementación tampoco hace nada, consulte la [fuente] (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.Transferible% 29). Solo hay un método en la interfaz 'ClipboardOwner', es decir,' lostOwnership (..) ', y' StringSelection' lo deja vacío. –

0

Un caso de uso de ejemplo es una implementación de ventana de terminal, donde cualquier selección se copia automáticamente en el portapapeles. La devolución de llamada lostOwnership(..) se puede usar para deseleccionar, de modo que el usuario sepa que se muestra una selección si y solo si está actualmente en el portapapeles. Esta expresión idiomática se usa, p. en rxvt (que no está escrito en Java, sin embargo).