2012-01-02 2 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을하고 JFrame 열고이 파일 목록 풍미 또는 1.7.01

JDK에 출력을 발생하는 URI리스트 맛

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; 
     } 
    }; 
    } 
} 

를 사용하는지 여부를 인쇄하는 JDK1.6.0.18에 출력 결과

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

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

내가 쉽게이 문제에 대한 해결 방법을 만들 수 있습니다,하지만 난 더 이상 알고 차이에 더 관심 및/또는 그러한 차이점에 대한 문서.

편집

일부 추가 조사/인터넷 검색 날 JDK7의 동작은 URI 및 파일 목록 데이터의 맛과 양도에 그들 모두를 제공하는 모두를 만드는 것입니다 생각합니다. 파일 목록에는 파일을 나타내는 URI 만 포함됩니다. 따라서 URL 만 드래그 앤 드롭하면 파일 목록이 비어 있습니다. transferable/transferdata가 네이티브 코드 (또는 적어도 소스 코드를 찾을 수없는 코드)로 만들어 졌으므로 JDK 소스 코드에서이를 찾을 수 없습니다. 오픈 JDK 메일 링리스트에 대한 논의는 자바에 네이티브에서 파일 목록을 드래그하면 응용 프로그램이 URI 목록과 파일 목록을 모두보고 다음과 같은 인용

를 포함하는 similar issue에 대해이 있었다. URI 목록을 드래그하면 URI 목록이 표시되고 모든 URI가 파일이거나 비어 있지 않은 파일 목록이거나 그렇지 않으면 빈 파일 목록이 표시됩니다.

Edit2가

의 I는 32/64 비트 리눅스 시스템에서 좀 더 테스트를 수행 serg.nechaev의 대답과 (XP에서 Windows7의에 이르기까지) 여러 Windows 시스템을 기반으로. JDK7이있는 Linux에서 항상 빈 filelist 맛과 결합 된 URI dataflavor를 얻습니다. Windows에서는 URI dataflavor와 비어 있지 않은 filelist 데이터 형식을 얻습니다. .URL 파일이 임시 디렉토리에서 생성 된 것으로 보이며 이는 JDK 6의 경우와 다른 filelist 데이터 형식에서도 전달됩니다.

이러한 모든 경우의 솔루션은 URI 데이터 형식을 확인하는 것입니다 먼저 파일 목록 데이터 flavor를 fallback으로 사용하십시오.

+1

자바 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, 파이어 폭스 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의 플랫폼 관련 버그 일 수 있습니다. 더 자세히 조사하고 오라클에 버그를 제출하고 싶을 수도 있습니다.

+0

아직 WinXP를 검사하지 않았지만 오늘 테스트를 해보고 동일한 문제가 있는지 여부를 알려줍니다. . – Robin