में बाहरी फ़ाइल खींचते समय कस्टम कर्सर सेट करें मेरे पास एक स्विंग एप्लिकेशन है जिसमें मैं बाहरी फ़ाइल को एप्लिकेशन पर विंडोज एक्सप्लोरर से खींचकर बाहरी फ़ाइल आयात करना चाहता हूं। मेरे पास यह बुनियादी कार्यक्षमता काम कर रही है। हालांकि, मैं एक उचित उपयुक्त कर्सर में डिफ़ॉल्ट ड्रैग/ड्रॉप कर्सर आइकन को बदलना चाहता हूं। माउस कुंजी दबाए जाने पर और एप्लिकेशन पर आयोजित होने पर मैं उपयोगकर्ता को दिखाई देने वाले कर्सर को बदलने में सक्षम नहीं हूं। मैंने इस काम के उदाहरण देखे हैं यदि ड्रैग और ड्रॉप ऑपरेशन एक ही स्विंग एप्लिकेशन के भीतर है। मैंने किसी भी लाभ के लिए 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;
}
}
}
नहीं, इस सवाल का जवाब नहीं दिया। मैंने पिछली बार देखा और setDropTarget का उपयोग करने का प्रयास किया। dragEnter विधि उचित समय पर कहा जाता हो करता है, लेकिन कर्सर डिफ़ॉल्ट खींचें/ड्रॉप आइकन रहता है और एक मैं निर्दिष्ट किया है करने के लिए नहीं बदलेगा। – agility
मैं dragOver में कर्सर सेट करने की कोशिश की और अस्थिर http://bugs.sun.com/view_bug.do?bug_id=4451328 में वर्णित का अनुभव किया। हो सकता है कि यह सब के बाद तय नहीं है। – tenorsax