दिलचस्प पोस्ट
जावा में बड़ी फ़ाइलों को पढ़ें मैं जावा में टाइमआउट के साथ कुछ अवरोधक विधि कैसे कॉल करूं? जावा में सरणी के न्यूनतम / अधिकतम तत्व खोजें सी में कोण से एक वृत्त की परिधि पर बिंदु की गणना? कैसे एक आराम एपीआई लिखने के लिए? Google मानचित्र एपीआई वी 3 में केंद्र बिंदु को ऑफसेट कैसे करें ट्यूपल्स में अस्थिर वस्तुओं क्यों हो सकते हैं? कैसे कंसोल.इन (stdin) को पुनः निर्देशित कर दिया गया है? एंड्रॉइड फोन मॉडल प्रोग्रामेटिक रूप से प्राप्त करें मेरा Magento एक्सटेंशन इंस्टॉल स्क्रिप्ट रन नहीं होगा गतिशील रूप से three.js के साथ एक रेखा खींचना जावा में होस्टनाम प्राप्त करने का अनुशंसित तरीका क्या मुझे अपनी प्रोजेक्ट फाइल को संस्करण नियंत्रण में रखना चाहिए? कन्स्ट्रक्टर से सी ++ आभासी फ़ंक्शन If () {} और if () के बीच अंतर: endif;

जावा – अपने घटकों के साथ जेपीएनएल खींचें और ड्रॉप कैसे करें

खींचने और छोड़ने के बारे में मेरे पास एक सवाल है: मैं लेबल्स, टेक्स्ट या आइकन को छोड़ सकता हूं। लेकिन मैं अपने सभी घटकों (लेबल, टेक्स्टबॉक्स, आदि आदि) के साथ एक जेपीनल को खींचकर ड्रॉप करना चाहता हूं।

मैं यह कैसे कर सकता हूँ ?

वेब के समाधान से एकत्रित समाधान "जावा – अपने घटकों के साथ जेपीएनएल खींचें और ड्रॉप कैसे करें"

यह समाधान काम करता है कुछ गुफाओं के साथ शुरू करने के लिए

मैंने ट्रांसफरहैंडलर एपीआई का उपयोग नहीं किया था मुझे यह पसंद नहीं है, यह प्रतिबंधात्मक है, लेकिन यह एक निजी बात है (यह क्या करता है, यह ठीक है), इसलिए यह आपकी उम्मीदों को पूरा नहीं कर सकता है।

मैं बॉर्डर लेआउट के साथ परीक्षण कर रहा था यदि आप अन्य लेआउट का उपयोग करना चाहते हैं, तो आपको कोशिश करनी पड़ेगी और समझ लेंगे। डीएनडी सबसिस्टम माउस पॉइंट के बारे में जानकारी प्रदान करता है (जब चलती है और गिरती है)

तो हमें क्या चाहिए:

ए डेटाफ़्लवर मैंने ऐसा करने का फैसला किया क्योंकि इससे प्रतिबंध का एक बड़ा सौदा हो सकता है

public class PanelDataFlavor extends DataFlavor { // This saves me having to make lots of copies of the same thing public static final PanelDataFlavor SHARED_INSTANCE = new PanelDataFlavor(); public PanelDataFlavor() { super(JPanel.class, null); } } 

एक हस्तांतरणीय डेटाफ्लावार्स के एक समूह के साथ डेटा (हमारे जेपीएनएल) को लपेटने वाले किसी प्रकार का आवरण (हमारे मामले में, केवल पैनलडेटाफ़्लवर)

 public class PanelTransferable implements Transferable { private DataFlavor[] flavors = new DataFlavor[]{PanelDataFlavor.SHARED_INSTANCE}; private JPanel panel; public PanelTransferable(JPanel panel) { this.panel = panel; } @Override public DataFlavor[] getTransferDataFlavors() { return flavors; } @Override public boolean isDataFlavorSupported(DataFlavor flavor) { // Okay, for this example, this is over kill, but makes it easier // to add new flavor support by subclassing boolean supported = false; for (DataFlavor mine : getTransferDataFlavors()) { if (mine.equals(flavor)) { supported = true; break; } } return supported; } public JPanel getPanel() { return panel; } @Override public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { Object data = null; if (isDataFlavorSupported(flavor)) { data = getPanel(); } else { throw new UnsupportedFlavorException(flavor); } return data; } } 

एक "ड्रैगजस्टाअर लिस्टनर"

इसके लिए, मैंने एक साधारण ड्रैगस्टेस्टहैंडलर बनाया है जो "जेपीएनएल" को खींचती है, जैसा कि सामग्री खींचती है। यह इशारे हैंडलर को स्वयं प्रबंधित करने की अनुमति देता है

 public class DragGestureHandler implements DragGestureListener, DragSourceListener { private Container parent; private JPanel child; public DragGestureHandler(JPanel child) { this.child = child; } public JPanel getPanel() { return child; } public void setParent(Container parent) { this.parent = parent; } public Container getParent() { return parent; } @Override public void dragGestureRecognized(DragGestureEvent dge) { // When the drag begins, we need to grab a reference to the // parent container so we can return it if the drop // is rejected Container parent = getPanel().getParent(); setParent(parent); // Remove the panel from the parent. If we don't do this, it // can cause serialization issues. We could over come this // by allowing the drop target to remove the component, but that's // an argument for another day parent.remove(getPanel()); // Update the display parent.invalidate(); parent.repaint(); // Create our transferable wrapper Transferable transferable = new PanelTransferable(getPanel()); // Start the "drag" process... DragSource ds = dge.getDragSource(); ds.startDrag(dge, Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR), transferable, this); } @Override public void dragEnter(DragSourceDragEvent dsde) { } @Override public void dragOver(DragSourceDragEvent dsde) { } @Override public void dropActionChanged(DragSourceDragEvent dsde) { } @Override public void dragExit(DragSourceEvent dse) { } @Override public void dragDropEnd(DragSourceDropEvent dsde) { // If the drop was not sucessful, we need to // return the component back to it's previous // parent if (!dsde.getDropSuccess()) { getParent().add(getPanel()); getParent().invalidate(); getParent().repaint(); } } } 

ठीक है, इसलिए मूल बातें अब हमें इसे एक साथ तार करने की आवश्यकता है …

इसलिए, पैनल में मैं खींच कर खींचने के लिए चाहता हूं:

  private DragGestureRecognizer dgr; private DragGestureHandler dragGestureHandler; @Override public void addNotify() { super.addNotify(); if (dgr == null) { dragGestureHandler = new DragGestureHandler(this); dgr = DragSource.getDefaultDragSource().createDefaultDragGestureRecognizer( this, DnDConstants.ACTION_MOVE, dragGestureHandler); } } @Override public void removeNotify() { if (dgr != null) { dgr.removeDragGestureListener(dragGestureHandler); dragGestureHandler = null; } dgr = null; super.removeNotify(); } 

इस तरह से जोड़ने / हटाने का उपयोग करने का कारण यह है कि सिस्टम को साफ रखने के लिए इससे हमारे घटक को तब तक पहुंचने में मदद मिलती है जब हमें उनकी आवश्यकता नहीं रहती है। यह स्वचालित पंजीकरण भी प्रदान करता है। आप अपनी खुद की "setDraggable" विधि का उपयोग करना चाह सकते हैं

यह ड्रैग साइड है, अब ड्रॉप साइड के लिए

सबसे पहले, हमें एक DropTargetListener की आवश्यकता है:

 public class DropHandler implements DropTargetListener { @Override public void dragEnter(DropTargetDragEvent dtde) { // Determine if can actual process the contents comming in. // You could try and inspect the transferable as well, but // There is an issue on the MacOS under some circumstances // where it does not actually bundle the data until you accept the // drop. if (dtde.isDataFlavorSupported(PanelDataFlavor.SHARED_INSTANCE)) { dtde.acceptDrag(DnDConstants.ACTION_MOVE); } else { dtde.rejectDrag(); } } @Override public void dragOver(DropTargetDragEvent dtde) { } @Override public void dropActionChanged(DropTargetDragEvent dtde) { } @Override public void dragExit(DropTargetEvent dte) { } @Override public void drop(DropTargetDropEvent dtde) { boolean success = false; // Basically, we want to unwrap the present... if (dtde.isDataFlavorSupported(PanelDataFlavor.SHARED_INSTANCE)) { Transferable transferable = dtde.getTransferable(); try { Object data = transferable.getTransferData(PanelDataFlavor.SHARED_INSTANCE); if (data instanceof JPanel) { JPanel panel = (JPanel) data; DropTargetContext dtc = dtde.getDropTargetContext(); Component component = dtc.getComponent(); if (component instanceof JComponent) { Container parent = panel.getParent(); if (parent != null) { parent.remove(panel); } ((JComponent)component).add(panel); success = true; dtde.acceptDrop(DnDConstants.ACTION_MOVE); invalidate(); repaint(); } else { success = false; dtde.rejectDrop(); } } else { success = false; dtde.rejectDrop(); } } catch (Exception exp) { success = false; dtde.rejectDrop(); exp.printStackTrace(); } } else { success = false; dtde.rejectDrop(); } dtde.dropComplete(success); } } 

अंत में, हमें इच्छुक पार्टियों के साथ ड्रॉप लक्ष्य रजिस्टर करने की जरूरत है … उन कंटेनरों में जो आप जोड़ना चाहते हैं ड्रॉप का समर्थन करने में सक्षम हैं

 DropTarget dropTarget; DropHandler dropHandler; . . . dropHandler = new DropHandler(); dropTarget = new DropTarget(pnlOne, DnDConstants.ACTION_MOVE, dropHandler, true); 

निजी तौर पर, मैं addNotify में आरंभ और removeNotify में निपटाना

 dropTarget.removeDropTargetListener(dropHandler); 

AddNotifty पर बस एक त्वरित नोट, मुझे इसे कई बार उत्तराधिकार में बुलाया गया था, इसलिए आप दोबारा जांच कर सकते हैं कि आपने पहले से ही ड्रॉप लक्ष्य निर्धारित नहीं किए हैं।

बस।

आपको ब्याज के निम्नलिखित में से कुछ भी मिल सकते हैं

http://rabbit-hole.blogspot.com.au/2006/05/my-drag-image-is-better-than-yours.html

http://rabbit-hole.blogspot.com.au/2006/08/drop-target-navigation-or-you-drag.html

http://rabbit-hole.blogspot.com.au/2006/04/smooth-jlist-drop-target-animation.html

यह ब्याज से बाहर होने के बावजूद, उन्हें न जांचने के लिए बर्बाद हो जाएगा।

यह कोड एक बड़ी मदद MadProgrammer है उन वर्गों का इस्तेमाल करने वाले किसी के लिए, लेकिन आप खींचते हुए पैनल में एक बटन से ड्रैग आरंभ करना चाहता है, मैंने विस्तारित जेपीनल को केवल एक जेबटन के साथ बदल दिया, जो कि कंस्ट्रक्टर में पैनल लेता है:

 public class DragActionButton extends JButton { private DragGestureRecognizer dgr; private DragGestureHandler dragGestureHandler; private JPanel actionPanel; DragActionButton (JPanel actionPanel, String buttonText) { this.setText(buttonText); this.actionPanel = actionPanel; } @Override public void addNotify() { super.addNotify(); if (dgr == null) { dragGestureHandler = new DragGestureHandler(this.actionPanel); dgr = DragSource.getDefaultDragSource().createDefaultDragGestureRecognizer( this, DnDConstants.ACTION_MOVE, dragGestureHandler); } } @Override public void removeNotify() { if (dgr != null) { dgr.removeDragGestureListener(dragGestureHandler); dragGestureHandler = null; } dgr = null; super.removeNotify(); } } 

तो आप ऐसा करते समय बटन बनाते हैं:

  this.JButtonDragIt = new DragActionButton(this.JPanel_To_Drag, "button-text-here");