दिलचस्प पोस्ट
एंड्रॉइड में फोन कॉल कैसे रिकॉर्ड करें? बाध्यकारी बटन एक विधि पर क्लिक करें माउस कर्सर को सी # का उपयोग कैसे करें? विंडोज 7 में सर्विस कंट्रोलर अनुमतियां उद्देश्य-सी 101 (बनाए रखने बनाम असाइन) NSString यह छवि परिवर्तन कैसे करें? `{}` का प्रयोग करते हुए मेरे स्ट्रक्चर के सदस्यों को ठीक से शुरू करने के लिए क्यों नहीं? एक बार में प्रति उपयोगकर्ता एक सत्र की सीमा निर्धारित करें डोमेन PHP पार्सर का उपयोग कैसे करें जावा में कुछ सेकंड के इंतजार के लिए मैं सेलेनियम-वेबड्राइवर से कैसे पूछ सकता हूं? C ++ 11 – स्थिरता समारोह के भीतर static_assert? मैं पायथन से कैसे एक DLL फ़ाइल का उपयोग कर सकता हूँ? साधारण शब्दों में 3 एनएफ और बीसीएनएफ के बीच अंतर (8 वर्षीय को समझाने में सक्षम होना चाहिए) "मल्टीकोर" असेंबली भाषा क्या दिखती है? PowerShell में एमडी 5 चेकसम कैसे प्राप्त करें I

JList से JLabel में कस्टम ऑब्जेक्ट खींचें और ड्रॉप करें

मेरे पास एक जेलिस्ट है जिसमें कस्टम ऑब्जेक्ट का एक ArrayList है और मैं ड्रैग बनाने और फ़ील्ड में ड्रॉप करने की कोशिश कर रहा हूं। हस्तांतरणीय में ऑब्जेक्ट को पैकेज और प्राप्त करने के तरीके को समझने में मुझे परेशानी हो रही है

यह लगभग जहाँ तक मैंने कमाया है:

import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import java.util.*; public class FlightProjectInterface extends JFrame{ //create GUI Objects private JFrame primaryFrame; private JPanel createFlightPanel; private JPanel aircraftLayout; private JList personsJList, personsOnFlightJList; private JTextField pilotLabel, coPilotLabel, backseat1Label, backseat2Label; public FlightProjectInterface(){ //establish frame super("Create Flight"); setLayout( new FlowLayout()); //aircraftPanel aircraftLayout = new JPanel(); aircraftLayout.setLayout(new GridLayout(2,2)); pilotLabel = new JTextField("Drag Pilot Here"); //build person load list DefaultListModel listModel = new DefaultListModel(); for (Person person : Database.persons) listModel.addElement(person); personsJList = new JList(listModel); personsJList.setVisibleRowCount(5); personsJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); personsJList.setDragEnabled(true); add( new JScrollPane(personsJList) ); aircraftLayout.add(pilotLabel); add(aircraftLayout); }//end constructor } 

स्पष्टीकरण: मुझे जेलिस्ट से ऑब्जेक्ट का चयन करने में परेशानी हो रही है और इससे बाहर एक हस्तांतरणीय बनाने उपरोक्त कोड के साथ, ऑब्जेक्ट के टॉस्ट्रिंग का प्रतिनिधित्व केवल टेक्स्ट फ़ील्ड में चिपकाया जाता है, इसलिए मैं हटाए गए स्थान से ऑब्जेक्ट डेटा को खींच नहीं पा रहा हूं। मैं स्वयं वस्तु "पैकेज" कैसे कर सकता हूं और इसे प्लेसहोल्डर में छोड़ सकता हूं, जिससे मैं खुद को GUI से ऑब्जेक्ट को संदर्भित कर सकता हूं?

आदर्श रूप में, 4 फ़ील्ड होंगे जिनमें प्रत्येक में एक वस्तु है जिसे छोड़ा जा सकता है। व्यक्ति को सूची में से निकाल दिया जाएगा, यदि उन्हें हटा दिया गया है, लेकिन यदि प्रतिस्थापित किया गया तो वह सूची में वापस आ जाएगा।

वेब के समाधान से एकत्रित समाधान "JList से JLabel में कस्टम ऑब्जेक्ट खींचें और ड्रॉप करें"

ड्रैग एंड ड्रॉप एक जटिल जानवर हो सकता है, उपलब्ध परस्पर विरोधी जानकारी से कोई भी आसान नहीं बनाया गया है। निजी तौर पर, मैं ट्रांसपोर्ट एपीआई से बचना चाहता हूं, लेकिन मैं उस तरह पुराने स्कूल हूं।

DataFlavor को गोंद वास्तव में DataFlavor मैं अपना अपना रोल करना पसंद करता हूं, जीवन को बहुत आसान बना देता है

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

इसका मुख्य कारण यह है कि, मैं अपने canImport पद्धति में एक जाल canImport इसे अस्वीकार कर देता हूं अगर एक canImport पर खींचते हुए, तो आप इसे केवल JLabel पर छोड़ सकते हैं, यह थोड़ा हैक है और शायद सबसे अच्छा विचार नहीं है।

 import java.awt.BorderLayout; import java.awt.Component; import java.awt.EventQueue; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.dnd.DnDConstants; import java.io.IOException; import javax.swing.DefaultListModel; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.TransferHandler; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class DnDTransferableTest { public static void main(String[] args) { new DnDTransferableTest(); } public DnDTransferableTest() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } @SuppressWarnings("serial") public class TestPane extends JPanel { private JList<ListItem> list; private JLabel label; public TestPane() { list = new JList<ListItem>(); list.setDragEnabled(true); list.setTransferHandler(new ListTransferHandler()); DefaultListModel<ListItem> model = new DefaultListModel<ListItem>(); for (int index = 0; index < 10; index++) { model.addElement(new ListItem("Item " + index)); } list.setModel(model); setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.weighty = 1; gbc.weightx = 1; gbc.fill = GridBagConstraints.BOTH; add(new JScrollPane(list), gbc); label = new JLabel("Drag on me..."); gbc.gridx++; gbc.weightx = 1; gbc.fill = GridBagConstraints.NONE; add(label, gbc); label.setTransferHandler(new ListTransferHandler()); } } @SuppressWarnings("serial") public class ListTransferHandler extends TransferHandler { @Override public boolean canImport(TransferSupport support) { return (support.getComponent() instanceof JLabel) && support.isDataFlavorSupported(ListItemTransferable.LIST_ITEM_DATA_FLAVOR); } @Override public boolean importData(TransferSupport support) { boolean accept = false; if (canImport(support)) { try { Transferable t = support.getTransferable(); Object value = t.getTransferData(ListItemTransferable.LIST_ITEM_DATA_FLAVOR); if (value instanceof ListItem) { Component component = support.getComponent(); if (component instanceof JLabel) { ((JLabel)component).setText(((ListItem)value).getText()); accept = true; } } } catch (Exception exp) { exp.printStackTrace(); } } return accept; } @Override public int getSourceActions(JComponent c) { return DnDConstants.ACTION_COPY_OR_MOVE; } @Override protected Transferable createTransferable(JComponent c) { Transferable t = null; if (c instanceof JList) { @SuppressWarnings("unchecked") JList<ListItem> list = (JList<ListItem>) c; Object value = list.getSelectedValue(); if (value instanceof ListItem) { ListItem li = (ListItem) value; t = new ListItemTransferable(li); } } return t; } @Override protected void exportDone(JComponent source, Transferable data, int action) { System.out.println("ExportDone"); // Here you need to decide how to handle the completion of the transfer, // should you remove the item from the list or not... } } public static class ListItemTransferable implements Transferable { public static final DataFlavor LIST_ITEM_DATA_FLAVOR = new DataFlavor(ListItem.class, "java/ListItem"); private ListItem listItem; public ListItemTransferable(ListItem listItem) { this.listItem = listItem; } @Override public DataFlavor[] getTransferDataFlavors() { return new DataFlavor[]{LIST_ITEM_DATA_FLAVOR}; } @Override public boolean isDataFlavorSupported(DataFlavor flavor) { return flavor.equals(LIST_ITEM_DATA_FLAVOR); } @Override public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { return listItem; } } public static class ListItem { private String text; public ListItem(String text) { this.text = text; } public String getText() { return text; } @Override public String toString() { return getText(); } } }