2012-01-02 26 views
7

JDK1.6とJDK1.7の間のドラッグ&ドロップの動作の違いについて知っていますか?ブラウザからJDK1.5、JDK1.6、JDK1.7をサポートする必要があるアプリケーションにURLをドラッグアンドドロップすると、次のような違いが発生しました。私は今、他の違いが存在するかどうか、どこかに文書化されているかどうか疑問に思っています。JDK1.6とJDK1.7の間のドラッグアンドドロップの相違

私が遭遇したさまざまな動作は、URLをブラウザで(アドレスバーからではなくページから)ドラッグアンドドロップすると、URLをクリックしてJavaアプリケーションにドラッグすることです。 JDK1.6では、TransferableはDataFlavor.javaFileListFlavorをサポートしておらず、JDK1.7でもサポートされています(ただし、転送データをリクエストすると空のリストが返されます)。次のコードは、この問題を示しています。それはあなたがドラッグアンドドロップhttp://www.google.comのようなURLを、それがファイルリストの風味やURIリスト味JDK 1.7.01

の出力を結果として生じる

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.TransferHandler; 
import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.Transferable; 
import java.awt.datatransfer.UnsupportedFlavorException; 
import java.io.File; 
import java.io.IOException; 
import java.lang.reflect.InvocationTargetException; 
import java.util.List; 

public class DragAndDropTester { 
    private static DataFlavor URI_LIST_FLAVOR = null; 

    static { 
    try { 
     URI_LIST_FLAVOR = new DataFlavor("text/uri-list;class=java.lang.String"); 
    } 
    catch (ClassNotFoundException ignore) { 
    } 
    } 
    public static void main(String[] args) { 
    try { 
     EventQueue.invokeAndWait(new Runnable() { 
     public void run() { 

      JFrame testFrame = new JFrame("Test"); 

      JPanel contents = new JPanel(new BorderLayout()); 
      contents.add(new JLabel("TestLabel"), BorderLayout.CENTER); 

      contents.setTransferHandler(createTransferHandler()); 

      testFrame.getContentPane().add(contents); 
      testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      testFrame.setSize(200, 200); 
      testFrame.setVisible(true); 
     } 
     }); 
    } catch (InterruptedException e) { 
     throw new RuntimeException(e); 
    } catch (InvocationTargetException e) { 
     throw new RuntimeException(e); 
    } 
    } 

    private static TransferHandler createTransferHandler(){ 
    return new TransferHandler(){ 
     @Override 
     public boolean importData(JComponent comp, Transferable aTransferable) { 
     try { 
      if (aTransferable.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { 
      System.out.println("File list flavor"); 
      List<File> file_list = (List<File>) aTransferable.getTransferData(DataFlavor.javaFileListFlavor); 
      System.out.println("file_list = " + file_list); 
      } 
       if (URI_LIST_FLAVOR != null && aTransferable.isDataFlavorSupported(URI_LIST_FLAVOR)){ 
      System.out.println("URI list flavor"); 
      String uri_list = (String) aTransferable.getTransferData(URI_LIST_FLAVOR); 
      System.out.println("uri_list = " + uri_list); 
      } 
     } catch (UnsupportedFlavorException e) { 
      throw new RuntimeException(e); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
     return true; 
     } 

     @Override 
     public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) { 
     return true; 
     } 
    }; 
    } 
} 

を使用するかどうかを出力していることができた上JFrameを開きます私は簡単にこの問題の回避策を作成することができますが、私はもっと知っ違いで、より興味を持っていJDK1.6.0.18

URI list flavor 
uri_list = http://www.google.com 

の出力を結果として生じる

File list flavor 
file_list = [] 
URI list flavor 
uri_list = http://www.google.com 

および/またはそれらの違いに関する文書。

編集

いくつかのさらなる調査/グーグルでは、私はJDK7の行動はURIとファイルリストデータ風味と譲渡の両方でそれらを提供するの両方を作成することだと思います。ファイルリストには、ファイルを表すURIのみが含まれます。したがって、URLをドラッグアンドドロップするだけでは、ファイルリストは空です。転送可能な/ transferdataがネイティブコード(または少なくとも私がソースを見つけられないコード)で作成されているように見えるので、JDKのソースコードでこれを見つけることができません。 OpenJDKのメーリングリストでの議論では、Javaにネイティブからファイルリストをドラッグすると、アプリケーションはURIのリストとファイルリストの両方を見て、次の引用

を含む、similar issueについてありました。 URIリストをドラッグするとURIリストが表示され、すべてのURIがファイルでもない場合は空のファイルリスト、そうでない場合は空のファイルリストだけが表示されます。 serg.nechaevの回答に基づいて

EDIT2

私は(XPからのWindows7の範囲)32/64ビットのLinuxシステムといくつかのWindowsシステム上でいくつかのより多くのテストを行いました。 JDK7のLinuxでは、私はいつも空のfilelistフレーバーと組み合わされたURIデータフレーバーを取得します。 Windowsでは、URI dataflavorと空でないfilelistデータフレーバを取得します。 .URLファイルがtempディレクトリに作成されたように見えますが、これはJDK 6の場合とは違うfilelistデータフレーバーにも渡されます。

これらのすべての場合の解決策は、最初にファイルリストのデータフレーバーをフォールバックとして使用する

+1

Java 7は追加機能をサポートする必要があります。 Java 6で何かできることがあれば、Java 7ではバグではない可能性があります。私はJava 6をサポートするコードを書いており、Java 7でもうまくいきます。 Java 7のすべての新機能を知りたいので、その機能を使用するかどうかを決定すると言うなら、そのようなリストを作成するのは最初の方かもしれません。バージョン間のソースを比較する必要があるかもしれません。 BTW Java 6アップデート30には、移植されたJava 7機能の一部が含まれている場合があります。 –

+0

出力に見られるように、Java6とJava7の両方で実行できます。しかし、java 7の事実は、ファイルリストを取得してアプリケーション内のコードを壊してしまい、if-else if-else構造がすべてのデータフレーバーを処理します。これでコードリストのフレーバーブランチに入り、ファイルリストが空であるためデータをインポートできなくなった – Robin

答えて

2

この現象の原因となった変更は、$(JDK)/ jre/lib/flavormapにあると思います。プロパティ

http://hg.openjdk.java.net/jdk7/hotspot-gc/jdk/diff/fd5bf5955e37/src/windows/lib/flavormap.properties

しかし、あなたのサンプルを使用し、あなたのポストからグーグルへのリンクをドラッグし、私は、ファイルリストの両方を取得しています& URIリストをJDK 1.7.0にWinXPのは、Firefox 8に:

File list flavor 
file_list = [C:\DOCUME~1\SERGN\LOCALS~1\Temp\httpwww.google.com.URL] 
URI list flavor 
uri_list = http://www.google.com/ 

これは、JDK 1.7.01のプラットフォーム固有のバグである可能性があります。詳細は調査し、Oracleにバグを報告することをおすすめします。

+0

私はまだWinXPをチェックしていませんが、今日テストして、同じ問題があるかどうかをお知らせします。 – Robin

関連する問題