2012-01-17 14 views
7

में बाहरी फ़ाइल खींचते समय कस्टम कर्सर सेट करें मेरे पास एक स्विंग एप्लिकेशन है जिसमें मैं बाहरी फ़ाइल को एप्लिकेशन पर विंडोज एक्सप्लोरर से खींचकर बाहरी फ़ाइल आयात करना चाहता हूं। मेरे पास यह बुनियादी कार्यक्षमता काम कर रही है। हालांकि, मैं एक उचित उपयुक्त कर्सर में डिफ़ॉल्ट ड्रैग/ड्रॉप कर्सर आइकन को बदलना चाहता हूं। माउस कुंजी दबाए जाने पर और एप्लिकेशन पर आयोजित होने पर मैं उपयोगकर्ता को दिखाई देने वाले कर्सर को बदलने में सक्षम नहीं हूं। मैंने इस काम के उदाहरण देखे हैं यदि ड्रैग और ड्रॉप ऑपरेशन एक ही स्विंग एप्लिकेशन के भीतर है। मैंने किसी भी लाभ के लिए DragGestureListener और DragSource का उपयोग करके इसे पूरा करने का प्रयास किया है। ऐसा लगता है कि जब तक ड्रैग स्रोत स्विंग के भीतर नहीं है तब तक उन विधियों को तब तक नहीं बुलाया जाता है। स्विंग एप्लिकेशन में बाहरी फ़ाइल खींचते समय ड्रैग कर्सर को बदलना संभव है?स्विंग ऐप

कृपया इस सरल उदाहरण देखें:

public class DnDTemplate extends JFrame { 

private static final long serialVersionUID = 1L; 
private JComponent thePane = null; 
private Cursor dropCursor = null; 

public DnDTemplate() { 
    super("Drop File Here"); 

    thePane = (JComponent) getContentPane(); 
    thePane.setTransferHandler(new DndTransferHandler()); 

    ImageIcon imageIcon = new ImageIcon("drop_here.gif"); 
    Image image = imageIcon.getImage();  
    BufferedImage bufferedImage = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB); 
    Graphics graphics = bufferedImage.getGraphics(); 
    graphics.drawImage(image, 0, 0, null); 
    dropCursor = Toolkit.getDefaultToolkit().createCustomCursor(bufferedImage, new Point(16, 16), "drop cursor"); 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(300, 300); 
} 

public static void main(String[] args) { 
    new DnDTemplate().setVisible(true); 
} 

class DndTransferHandler extends TransferHandler { 

    private static final long serialVersionUID = 1L; 

    @Override 
    public boolean canImport(TransferHandler.TransferSupport info) { 
     // This gets called repeatedly while dragged file is over frame 
     if (!info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { 
      return false; 
     } 
     // Even though this method is called at the appropriate time, 
     // setting the cursor here is of no consequence 
     info.getComponent().setCursor(dropCursor); 

     return true; 
    } 

    @Override 
    public boolean importData(TransferHandler.TransferSupport info) { 
     // this gets called when file is dropped 
     if (!info.isDrop()) { 
      return false; 
     } 

     Transferable transferable = info.getTransferable(); 
     String importFileName = null; 
     try { 
      List<File> fileList = (List<File>) transferable.getTransferData(DataFlavor.javaFileListFlavor); 
      Iterator<File> iterator = fileList.iterator(); 
      while (iterator.hasNext()) { 
       File f = iterator.next(); 
       importFileName = f.getAbsolutePath(); 
      } 
      info.getComponent().setCursor(dropCursor); 
      thePane.setCursor(dropCursor); 

     } catch (Exception e) { 
      return false; 
     } 

     System.out.println("Importing " + importFileName); 
     // Return the cursor back to the default 
     thePane.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 
     return true; 
    } 

} 

}

+6

नहीं, इस सवाल का जवाब नहीं दिया। मैंने पिछली बार देखा और setDropTarget का उपयोग करने का प्रयास किया। dragEnter विधि उचित समय पर कहा जाता हो करता है, लेकिन कर्सर डिफ़ॉल्ट खींचें/ड्रॉप आइकन रहता है और एक मैं निर्दिष्ट किया है करने के लिए नहीं बदलेगा। – agility

+0

मैं dragOver में कर्सर सेट करने की कोशिश की और अस्थिर http://bugs.sun.com/view_bug.do?bug_id=4451328 में वर्णित का अनुभव किया। हो सकता है कि यह सब के बाद तय नहीं है। – tenorsax

उत्तर

1

अस्वीकरण: इस एक टिप्पणी और नहीं एक जवाब किया जाना चाहिए था, लेकिन यह अभी भी टिप्पणी में फिट करने के लिए लंबा है। अगर यह पूरी तरह से गलत है तो मैं इस जवाब को हटा दूंगा

मैंने इसका परीक्षण नहीं किया लेकिन TransferHandler के एपीआई को देखकर मैं TransferHandler#getDragImage विधि को देखने का सुझाव दूंगा।

प्रलेखन थोड़ा अस्पष्ट है कि इस छवि का उपयोग तब किया जाता है जब ड्रैग उस घटक से शुरू किया जाता है जिसके लिए TransferHandler सेट किया गया है, या जब भी ड्रैग को एप्लिकेशन के बाहर से शुरू किया जाता है और कर्सर आ जाता है घटक जिसके लिए TransferHandler सेट है। मैं खींचें और ड्रॉप एक बाहरी अनुप्रयोग

Bug ID 4816922TransferHandler#getVisualRepresentation उपयोग करने के लिए पता चलता है से आ रही के बारे में an example जो यह निश्चित रूप से जावा अनुप्रयोग में काम करता है सुझाव है कि लगता है, लेकिन अभी भी अधूरी पाया है, लेकिन यह स्पष्ट नहीं है कि बग पहले से ही तय हो गई है।

+2

हालांकि मैं मेरे सवाल में निर्दिष्ट किया जाना चाहिए था, मैं जावा 6. में एक समाधान यह केवल इसके अलावा जावा 7 में कार्यान्वित किया जाता है इस समाधान TransferHandler.setDragImage का उपयोग कर परीक्षण में, रहा हूँ, कॉल को नजरअंदाज किया जा करने के लिए प्रकट होता है और खींचें आइकन प्रकट होता है सेट करने के लिए कॉल के साथ और बिना ड्रैग इमेज। – agility