• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:TransferHandlerでHyperlinkをブラウザにドロップ
#navi(../)
#tags(DragAndDrop, TransferHandler, DataFlavor, Html, JButton)
RIGHT:Posted by &author(aterai); at 2007-12-03
* TransferHandlerでHyperlinkをブラウザにドロップ [#w00349ec]
``JButton``に``TransferHandler``を設定して、ブラウザにリンクをドロップできるようにします。
---
title: TransferHandlerでHyperlinkをブラウザにドロップ
tags: [DragAndDrop, TransferHandler, DataFlavor, Html, JButton]
author: aterai
pubdate: 2007-12-03T14:41:28+09:00
description: JButtonにTransferHandlerを設定して、ブラウザにリンクをドロップできるようにします。
---
* 概要 [#w00349ec]
`JButton`に`TransferHandler`を設定して、ブラウザにリンクをドロップできるようにします。

- &jnlp;
- &jar;
- &zip;
#download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTLyb41hvI/AAAAAAAAAYI/uoSzZ3thyWk/s800/DraggableLinkButton.png)

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

** サンプルコード [#udf5497a]
* サンプルコード [#udf5497a]
#code(link){{
final String href = "http://terai.xrea.jp/";
//final DataFlavor uriflavor = new DataFlavor(String.class, "text/uri-list");
final DataFlavor uriflavor = DataFlavor.stringFlavor;
JButton b = new JButton(href);
b.setTransferHandler(new TransferHandler("text") {
  public boolean canImport(JComponent c, DataFlavor[] flavors) {
  @Override public boolean canImport(JComponent c, DataFlavor[] flavors) {
    return (flavors.length>0 && flavors[0].equals(uriflavor));
  }
  public Transferable createTransferable(JComponent c) {
  @Override public Transferable createTransferable(JComponent c) {
    return new Transferable() {
      public Object getTransferData(DataFlavor flavor) {
      @Override public Object getTransferData(DataFlavor flavor) {
        //System.out.println(flavor.getMimeType());
        return href;
      }
      public DataFlavor[] getTransferDataFlavors() {
      @Override public DataFlavor[] getTransferDataFlavors() {
        return new DataFlavor[] { uriflavor };
      }
      public boolean isDataFlavorSupported(DataFlavor flavor) {
      @Override public boolean isDataFlavorSupported(DataFlavor flavor) {
        return flavor.equals(uriflavor);
      }
    };
  }
});
b.addMouseListener(new MouseAdapter() {
  public void mousePressed(MouseEvent e) {
  @Override public void mousePressed(MouseEvent e) {
    JButton button = (JButton)e.getSource();
    TransferHandler handler = button.getTransferHandler();
    handler.exportAsDrag(button, e, TransferHandler.COPY);
  }
});
}}

** 解説 [#nd12fea7]
上記のサンプルでは、``JButton``をマウスでブラウザにドラッグ&ドロップすると、そのサイトに移動するようになっています。ここでは、``JButton``を使用していますが、``JLabel``などの他のコンポーネントでも同様の設定が可能です。
* 解説 [#nd12fea7]
上記のサンプルでは、`JButton`をマウスでブラウザにドラッグ&ドロップすると、そのサイトに移動するようになっています。ここでは、`JButton`を使用していますが、`JLabel`などの他のコンポーネントでも同様の設定が可能です。

以下のような``TransferHandler``と``Transferable``を設定しています。
以下のような`TransferHandler`と`Transferable`を設定しています。

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

 http://terai.xrea.jp/

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

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

#comment