पर जावा ड्रैग और ड्रॉप मैं जावा प्रोग्राम बना रहा हूं, और फ़ाइलों को लोड करने का एक तरीका है फ़ाइल को एप्लिकेशन विंडो (स्विंग) पर खींचें। मेरे पास कोड है जो विंडोज और लिनक्स में काम करता है। यह ओएस एक्स में काम करता है, लेकिन पहली फ़ाइल जो मैं खींचता हूं वह अपवाद फेंकता है, और फिर बाकी ठीक काम करता है।मैक ओएस एक्स
यहां कोड है जिसका उपयोग मैं डीएनडी को सक्षम करने के लिए करता हूं।
/*
* Allow a file to be opened by dragging it onto the window
*/
public void drop(DropTargetDropEvent dtde){
try {
// Get the object to be transferred
Transferable tr = dtde.getTransferable();
DataFlavor[] flavors = tr.getTransferDataFlavors();
// If flavors is empty get flavor list from DropTarget
flavors = (flavors.length == 0) ? dtde.getCurrentDataFlavors() : flavors;
// Select best data flavor
DataFlavor flavor = DataFlavor.selectBestTextFlavor(flavors);
// Flavor will be null on Windows
// In which case use the 1st available flavor
flavor = (flavor == null) ? flavors[0] : flavor;
// Flavors to check
DataFlavor Linux = new DataFlavor("text/uri-list;class=java.io.Reader");
DataFlavor Windows = DataFlavor.javaFileListFlavor;
// On Linux (and OS X) file DnD is a reader
if(flavor.equals(Linux)) {
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
BufferedReader read = new BufferedReader(flavor.getReaderForText(tr));
// Remove 'file://' from file name
String fileName = read.readLine().substring(7).replace("%20"," ");
// Remove 'localhost' from OS X file names
if(fileName.substring(0,9).equals("localhost")) {
fileName = fileName.substring(9);
}
read.close();
dtde.dropComplete(true);
System.out.println("File Dragged:" + fileName);
mainWindow.openFile(fileName);
}
// On Windows file DnD is a file list
else if(flavor.equals(Windows)) {
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
@SuppressWarnings("unchecked")
List<File> list = (List<File>)tr.getTransferData(flavor);
dtde.dropComplete(true);
if(list.size() == 1) {
System.out.println("File Dragged: " + list.get(0));
mainWindow.openFile(list.get(0).toString());
}
} else {
System.err.println("DnD Error");
dtde.rejectDrop();
}
}
//TODO: OS X Throws ArrayIndexOutOfBoundsException on first DnD
catch(ArrayIndexOutOfBoundsException e){
System.err.println("DnD not initalized properly, please try again.");
} catch(IOException e){
System.err.println(e.getMessage());
} catch(UnsupportedFlavorException e){
System.err.println(e.getMessage());
} catch (ClassNotFoundException e){
System.err.println(e.getMessage());
}
}
किसी कारण से, ओएस एक्स इस लाइन पर एक ArrayIndexOutOfBoundsException फेंकता है:
flavor = (flavor == null) ? flavors[0] : flavor;
के बाद कि अपवाद फेंक दिया जाता है, अगर मैं खिड़की पर एक और फ़ाइल खींचें, यह काम करता है। यह अपवाद क्यों फेंकता है?
नोट: mainWindow.openFile() एक ऐसा फ़ंक्शन है जो फ़ाइल खोलता है। यह एक स्ट्रिंग पैरामीटर (फ़ाइल नाम) लेता है, और प्रोग्राम उस फ़ाइल को खोलता है।
नोट 2: यह ओएस एक्स 10.6.2 (हिम तेंदुए) पर है।
केवल मतलब हो सकता है कि उस बिंदु पर जायके कोई आंकड़ा नहीं है। क्या आपने जांच की है कि getTransferDataFlavors() प्राप्त करें या getCurrentDataFlavors() पहली ड्रैग/ड्रॉप पर कुछ वापस कर देता है? – jitter
खैर, स्वाद [0] मुझे सीमा अपवाद से बाहर कर रहा है। मैं जांचता हूं कि tr.getTransferDataFlavors() की शून्य लंबाई है, अगर मैं इसके बजाय dtde.getCurrentDataFlavors() का उपयोग करता हूं। तो जाहिर है, dtde.getCurrentDataFlavors() की लंबाई शून्य है, जो सीमा अपवाद से बाहर हो रही है। –
शायद अगर मैं dragFnter ईवेंट पर DataFlavors प्राप्त करने का प्रयास करता हूं, तो ड्रॉप ईवेंट ट्रिगर होने पर वे शून्य नहीं होंगे। अंत में –