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
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으로 사용하십시오.
자바 7은 추가 기능을 지원해야합니다. Java 6에서 뭔가를 할 수 있다면 Java 7에서 버그 일 가능성이 높습니다. Java 6를 지원하는 코드를 작성하면 Java 7에서도 작동합니다. Java 7의 새로운 기능을 모두 알기를 원한다면 해당 기능을 사용할지 여부를 결정하십시오. 그런 목록을 작성한 사람이 가장 먼저 작성해야합니다. 버전 간 소스를 비교해야 할 수도 있습니다. BTW Java 6 업데이트 30에는 이전 된 일부 Java 7 기능이있을 수 있습니다. –
출력에서 볼 수 있듯이 Java6과 Java7에서 모두 수행 할 수 있습니다. 그러나 Java 7의 사실은 파일 목록을 얻음으로써 내 애플리케이션의 코드를 손상시킵니다.이 코드는 모든 데이터 형식을 처리하는 if - else if - else 구조입니다. 이제 파일 목록이 비어 있기 때문에 코드의 파일 목록 풍미 지점에 들어가서 파일 목록이 비어있어 내 데이터를 가져 오지 않습니다. – Robin