---
category: swing
folder: DraggableLinkButton
title: TransferHandlerでHyperlinkをブラウザにドロップ
tags: [DragAndDrop, TransferHandler, DataFlavor, Html, JButton]
author: aterai
pubdate: 2007-12-03T14:41:28+09:00
description: JButtonにTransferHandlerを設定して、ブラウザにリンクをドロップできるようにします。
image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTLyb41hvI/AAAAAAAAAYI/uoSzZ3thyWk/s800/DraggableLinkButton.png
---
* 概要 [#summary]
`JButton`に`TransferHandler`を設定して、ブラウザにリンクをドロップできるようにします。

#download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTLyb41hvI/AAAAAAAAAYI/uoSzZ3thyWk/s800/DraggableLinkButton.png)

* サンプルコード [#sourcecode]
#code(link){{
String href = "https://ateraimemo.com/";
// DataFlavor uriflavor = new DataFlavor(String.class, "text/uri-list");
DataFlavor uriflavor = DataFlavor.stringFlavor;
JButton b = new JButton(href);
b.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
b.setTransferHandler(new TransferHandler("text") {
  @Override public boolean canImport(JComponent c, DataFlavor[] flavors) {
    return flavors.length > 0 && flavors[0].equals(uriflavor);
  }

  @Override public Transferable createTransferable(JComponent c) {
    return new Transferable() {
      @Override public Object getTransferData(DataFlavor flavor) {
        // System.out.println(flavor.getMimeType());
        return href;
      }

      @Override public DataFlavor[] getTransferDataFlavors() {
        return new DataFlavor[] {uriflavor};
      }

      @Override public boolean isDataFlavorSupported(DataFlavor flavor) {
        return flavor.equals(uriflavor);
      }
    };
  }
});
b.addMouseListener(new MouseAdapter() {
  @Override public void mousePressed(MouseEvent e) {
    JButton button = (JButton) e.getSource();
    TransferHandler handler = button.getTransferHandler();
    handler.exportAsDrag(button, e, TransferHandler.COPY);
  }
});
}}

* 解説 [#explanation]
上記のサンプルでは、`URL`文字列を設定した`JButton`をマウスでドラッグしてブラウザなどにドロップすると、そのサイトに移動できます。
上記のサンプルでは、`URL`文字列を設定した`JButton`をマウスでドラッグしてウェブブラウザなどにドロップすると、そのサイトに移動できます。

このような`URL`のドラッグ&ドロップを実行するために以下のような`TransferHandler`と`Transferable`を設定しています。

- 転送するプロパティー
-- `text`
- `DataFlavor`
-- `DataFlavor.stringFlavor`
- 転送するデータ
-- 文字列: `https://ateraimemo.com/`

* 参考リンク [#reference]
- [[Hyperlinkを、JLabel、JButton、JEditorPaneで表示>Swing/HyperlinkLabel]]
- [https://www.ne.jp/asahi/hishidama/home/tech/java/swing/TransferHandler.html Java Swing「ドラッグ&ドロップ」メモ(Hishidama's Swing-TransferHandler Memo)]

* コメント [#comment]
#comment
- `Opera`には、ドロップできないようです(`MIME`タイプを設定しないとダメ?)。 -- &user(aterai); &new{2007-12-03 (月) 14:41:28};

#comment