title: listen to clipboard changes, check ownership?
body: <p>I want to be notified if a string is copied to the system clipboard. When a new string is copied from the same source application, the FlavorListener won't get an event. To get informed when another string is copied, i read the string from the clipboard, convert it to a SrtingSelection, which is able to take the ownership, and put it back to the clipboard. Now I got informed twice, once the StringSelection lost ownership and once it takes it back. Is there a way to check for the ownership directly, instead of storing the string and check it equals the new one?
  Here is my code so far:</p>
  
  <pre><code> import java.awt.Toolkit;
  import java.awt.datatransfer.Clipboard;
  import java.awt.datatransfer.DataFlavor;
  import java.awt.datatransfer.FlavorEvent;
  import java.awt.datatransfer.FlavorListener;
  import java.awt.datatransfer.StringSelection;
  import java.awt.datatransfer.Transferable;
  import java.awt.datatransfer.UnsupportedFlavorException;
  import java.io.IOException;
  
  public class Main {
      public static void main(String[] args) throws Exception {
          // The clipboard
          final Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
          // read clipboard and take ownership to get the FlavorListener notified
          // when the content has changed but the owner has not
          processClipboard(cb);
          cb.addFlavorListener(new FlavorListener() {
              @Override
              public void flavorsChanged(FlavorEvent e) {
                  processClipboard(cb);
              }
          });
          // keep thread for testing
          Thread.sleep(100000L);
      }
  
      public static void processClipboard(Clipboard cb) {
          // gets the content of clipboard
          Transferable trans = cb.getContents(null);
          if (trans.isDataFlavorSupported(DataFlavor.stringFlavor)) {
              try {
                  // cast to string
                  String s = (String) trans
                          .getTransferData(DataFlavor.stringFlavor);
                  System.out.println(s);
                  // only StringSelection can take ownership, i think
                  StringSelection ss = new StringSelection(s);
                  // set content, take ownership
                  cb.setContents(ss, ss);
              } catch (UnsupportedFlavorException e2) {
                  e2.printStackTrace();
              } catch (IOException e2) {
                  e2.printStackTrace();
              }
          }
      }
  }
  </code></pre>
  
  <p>I hope you understand my bad english :-(</p>