TITLE:ClipboardServiceでシステム全体の共有クリップボードにアクセスする

Posted by at 2012-04-30

ClipboardServiceでシステム全体の共有クリップボードにアクセスする

ClipboardServiceを使って Java Web Start で動作中のアプリケーションからシステム全体の共有クリップボードにアクセスします。

  • &jnlp;
  • &jar;
  • &zip;
ClipboardService.png

サンプルコード

private ClipboardService cs;
View in GitHub: Java, Kotlin
try{
  cs = (ClipboardService)ServiceManager.lookup("javax.jnlp.ClipboardService");
}catch(Throwable t) {
  cs = null;
}
JTextArea textArea = new JTextArea() {
  @Override public void copy() {
    if(cs != null) {
      cs.setContents(new StringSelection(getSelectedText()));
    }
    super.copy();
  }
  @Override public void cut() {
    if(cs != null) {
      cs.setContents(new StringSelection(getSelectedText()));
    }
    super.cut();
  }
  @Override public void paste() {
    if(cs != null) {
      Transferable tr = cs.getContents();
      if(tr.isDataFlavorSupported(DataFlavor.stringFlavor)) {
        try{
          getTransferHandler().importData(this, tr);
        }catch(Exception e) {
          e.printStackTrace();
        }
      }
    }else{
      super.paste();
    }
  }
};

解説

Java Web Start から起動された制限付きのランタイム内で動作中するアプリケーションからは、システム全体の共有クリップボードにアクセスすることができないので、ServiceManagerからClipboardServiceを取得し、コピー、ペースト、カットなどでセキュリティ警告ダイアログを表示して、ユーザーにアクセス許可を求めます。

  • Cutの例
    • アプリケーションのクリップボード
      • セキュリティ警告でOK、取り消しのどちらを選択しても、JTextAreaの選択文字列はCutされ、アプリケーションのクリップボードは上書きされる
    • システム全体の共有クリップボード
    • セキュリティ警告でOKを選択するとシステム全体の共有クリップボードは上書きされ、取り消しを選択すると上書きされない

参考リンク

コメント