2009-11-08 19 views
7

पर जावा ड्रैग और ड्रॉप मैं जावा प्रोग्राम बना रहा हूं, और फ़ाइलों को लोड करने का एक तरीका है फ़ाइल को एप्लिकेशन विंडो (स्विंग) पर खींचें। मेरे पास कोड है जो विंडोज और लिनक्स में काम करता है। यह ओएस एक्स में काम करता है, लेकिन पहली फ़ाइल जो मैं खींचता हूं वह अपवाद फेंकता है, और फिर बाकी ठीक काम करता है।मैक ओएस एक्स

यहां कोड है जिसका उपयोग मैं डीएनडी को सक्षम करने के लिए करता हूं।

/* 
* 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 (हिम तेंदुए) पर है।

+0

केवल मतलब हो सकता है कि उस बिंदु पर जायके कोई आंकड़ा नहीं है। क्या आपने जांच की है कि getTransferDataFlavors() प्राप्त करें या getCurrentDataFlavors() पहली ड्रैग/ड्रॉप पर कुछ वापस कर देता है? – jitter

+0

खैर, स्वाद [0] मुझे सीमा अपवाद से बाहर कर रहा है। मैं जांचता हूं कि tr.getTransferDataFlavors() की शून्य लंबाई है, अगर मैं इसके बजाय dtde.getCurrentDataFlavors() का उपयोग करता हूं। तो जाहिर है, dtde.getCurrentDataFlavors() की लंबाई शून्य है, जो सीमा अपवाद से बाहर हो रही है। –

+0

शायद अगर मैं dragFnter ईवेंट पर DataFlavors प्राप्त करने का प्रयास करता हूं, तो ड्रॉप ईवेंट ट्रिगर होने पर वे शून्य नहीं होंगे। अंत में –

उत्तर

4

मैं भी इस समस्या थी लेकिन यह नवीनतम जावा संस्करण के साथ तय किया गया लगता है:

[email protected]:~/projects>java -version 
java version "1.6.0_17" 
Java(TM) SE Runtime Environment (build 1.6.0_17-b04-248-10M3025) 
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01-101, mixed mode) 
+0

। ऐसा लगता है कि इस समस्या को बिना किसी फिक्स के थोड़ी देर के लिए था। सुनिश्चित करने के लिए, मैं जल्द ही इसका परीक्षण करूंगा। –

+0

हाँ! ऐप्पल ने इसे जावा 1.6.0_17 में तय किया :- डी –