2012-03-29 6 views
5

मेरे पास दो नकली डेटा के साथ दो जेटी हैं, जो मैं करना चाहता हूं वह प्रत्येक 'नौकरी' (15663-1, 15663-2, आदि) लेने में सक्षम है और प्रत्येक के लिए एक नोड बना सकता है इसके नीचे प्रत्येक भाग के लिए नोड और उसके नीचे प्रत्येक भाग से जुड़े घटक। दो पेड़, इस तरह में:मैं एक जेटीआर से दूसरे में बुद्धिमान ड्रैग और ड्रॉप कैसे कार्यान्वित करूं?

+------------------------------+------------------------------+ 
| PARTS TO BE SHIPPED   | SHIPPING BOX     | 
+------------------------------+------------------------------+ 
|[JOB]       |[JOB]       | 
|+------[part]     |+------[part]    | 
|  +------[component] |  +------[component] | 
|  +------[component] |  +------[component] | 
|+------[part]     |+------[part]     | 
|  +------[component] |  +------[component] | 
|[JOB]       |[JOB]       | 
|+------[part]     |+------[part]     | 
|  +------[component] |  +------[component] | 
|  +------[component] |  +------[component] | 
|+------[part]     |+------[part]     | 
|  +------[component] |  +------[component] | 
+------------------------------+------------------------------+ 

ताकि मान मैं में काम एक में कवर में दो शिकंजा है jtree 'भागों भेज दिया' और मैं शिपिंग बॉक्स में joba में कुछ भी नहीं है, जब मैं शिपिंग बॉक्स में शिकंजा खींचता हूं तो उसे नौकरी ए के लिए एक प्रविष्टि बनाना चाहिए, भाग ए के लिए एक प्रविष्टि बनाना चाहिए और घटक के लिए एक प्रविष्टि बनाना है, तो मैं चाहता हूं कि यह उस घटक की मात्रा के लिए संकेत दें और उस मात्रा को घटाएं भागों को भेज दिया जा सकता है।

तो अगर मेरे पास 1553-4 नामक नौकरी है और इसमें चार शिकंजा के साथ एक कवर है और मैं शिकंजा को शिपिंग बॉक्स में खींचता हूं तो उसे शिपिंग बॉक्स में प्रवेश करना चाहिए जो कहता है, "एक्स शिकंजा" तो संकेत उपयोगकर्ता को शिकंजा की संख्या में प्रवेश करने के लिए, यदि वे दो शिकंजा पैकेज करते हैं तो jtree को उस नौकरी के लिए शेष 2 शिकंजाओं को प्रतिबिंबित करने के लिए बदलना चाहिए।

मैंने अलग-अलग ड्रैग और ड्रॉप ट्यूटोरियल का एक गुच्छा पढ़ा है और मेरे पास कुछ उदाहरण हैं लेकिन मुझे लगता है कि मैं इसे प्राप्त नहीं कर सकता। किसी भी सलाह या मदद की सराहना की जाएगी।

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

package com.protocase.examples; 


import java.awt.Dimension; 
import java.awt.HeadlessException; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeModel; 
import javax.swing.tree.MutableTreeNode; 

/** 
* @author DavidH 
*/ 
public class JTreeExample { 
    public static void main(String[] args) { 
     addTreesAndDisplay(); 

    } 

    private static void addTreesAndDisplay() throws HeadlessException { 
     JFrame frame = new JFrame(); 
     JPanel panel = new JPanel(); 


     JTree tree = new JTree(getTreeModel()); 
     tree.setDragEnabled(true); 
     tree.setPreferredSize(new Dimension(200,400)); 
     JScrollPane scroll = new JScrollPane(); 
     scroll.setViewportView(tree); 
     panel.add(scroll); 


     JTree secondTree = new JTree(getTreeModel()); 
     secondTree.setPreferredSize(new Dimension(200,400)); 
     secondTree.setDragEnabled(true); 
     JScrollPane secondScroll = new JScrollPane(); 
     secondScroll.setViewportView(secondTree); 
     panel.add(secondScroll); 


     frame.setContentPane(panel); 
     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    private static DefaultTreeModel getTreeModel() { 
     MutableTreeNode root = new DefaultMutableTreeNode("15663-1"); 
     DefaultMutableTreeNode cover = new DefaultMutableTreeNode("Cover"); 
     DefaultMutableTreeNode base = new DefaultMutableTreeNode("Base"); 
     root.insert(cover, 0); 
     root.insert(base, 0); 
     cover.insert(new DefaultMutableTreeNode("2x PEMS"), 0); 
     cover.insert(new DefaultMutableTreeNode("2x SCREWS"), 0); 
     base.insert(new DefaultMutableTreeNode("4x SCREWS"), 0); 
     base.insert(new DefaultMutableTreeNode("4x HANDLES"), 0); 
     DefaultTreeModel model = new DefaultTreeModel(root); 
     return model; 
    } 
} 

मैं सिर्फ एक संक्षिप्त खींचें की तलाश में और खींचने का उदाहरण ड्रॉप एक JTree में और से खींच कर रहा हूँ:

यह है कि मैं क्या है है कि मैं क्या है, यहाँ मैं बनाने नोड्स और इस तरह समझते हैं, है एक जेटी।

उत्तर

3

अपने स्वयं के शब्दों में स्विंग में खींचें और ड्रॉप करने के लिए एक बहुत छोटा, सरल परिचय और मेरे अपने अनुभव के आधार पर (जो मुख्य रूप से जेडीके 1.5 में ड्रैग-एंड-ड्रॉप के साथ था, इसलिए नई कार्यक्षमता पहले से मौजूद हो सकती है)।

ड्रैग-एंड-ड्रॉप ऑपरेशन में दो भाग हैं। सबसे पहले स्रोत घटक से खींचें है। TransferHandler of the source component एक Transferable बनाता है, जो डेटा के लिए एक कंटेनर है जिसे ड्रैग-एंड-ड्रॉप ऑपरेशन में आदान-प्रदान किया जाएगा। डेटा के आधार पर, डेटा के विभिन्न प्रतिनिधित्व हो सकते हैं (जिन्हें DataFlavor कहा जाता है)। उदाहरण के लिए यदि आप एक टेक्स्ट एडिटर में यूआरएल खींचते हैं और छोड़ते हैं, तो संभवतः यह यूआरएल को मौजूदा दस्तावेज़ में जोड़ देगा। लेकिन यदि आप इसे किसी वेब ब्राउज़र पर छोड़ देते हैं, तो आप उम्मीद करते हैं कि यह उस यूआरएल को खोल देगा। तो जहां पहली बार सादे पाठ में दिलचस्पी है, दूसरा दूसरा जटिल वस्तु में रुचि रख सकता है।

दूसरा भाग ड्रॉप है। सबसे पहले यह तय किया जाता है कि वर्तमान स्थान एक अच्छा ड्रॉप लक्ष्य है या नहीं। यह तय करने के लिए लक्षित घटक के स्थानांतरण हैंडलर पर निर्भर करता है कि यह ड्रॉप को स्वीकार करता है या नहीं। आम तौर पर यह जांच करके हासिल किया जाता है कि यह Transferable में Transferable को विशिष्ट DataFlavor (डेटा: Flavor दोनों के लिए स्रोत और लक्ष्य घटक दोनों के लिए जाना चाहिए) द्वारा पूछे गए डेटा को संभाल सकता है या नहीं। जब यह ड्रॉप स्वीकार करता है और उपयोगकर्ता माउस को रिलीज़ करता है, तो यह Transferable में डेटा को संभालने के साथ आगे बढ़ सकता है, और उम्मीद है कि इसके साथ कुछ उपयोगी हो।

लेकिन हमेशा के रूप में, Swing tutorials एक बहुत अच्छा प्रारंभिक बिंदु है।उनके माध्यम से जाने के बाद, आप शायद अधिक विस्तृत प्रश्न के साथ आ सकते हैं (यदि आपके पास अभी भी कोई है, क्योंकि आपकी आवश्यकता अपेक्षाकृत मामूली है)

+0

यह एक महान स्पष्टीकरण है। मुझे पता है कि मुझे ट्रांसफरहैंडलर को विस्तारित करने की आवश्यकता है, लेकिन क्या मुझे डेटाफ्लॉवर का विस्तार करने की आवश्यकता है? तो मुझे अपनी स्रोत सूची में ट्रांसफर हैंडलर का विस्तार करने की आवश्यकता है और इसे एक हस्तांतरणीय संस्करण में पैकेज करने के लिए क्या करना है (जो एक वस्तु है जो किसी ऑब्जेक्ट का मालिक है और ट्रांसफर करने योग्य है) और फिर गंतव्य के लिए दूसरा ट्रांसफर हैंडलर लिखना है (जब तक कि पहले स्थानांतरण हैंडलर को पता न हो कि दोनों कैसे करें)? डेटाफ्लॉवर कहां आते हैं? – davidahines

+1

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

+0

धन्यवाद, मैं इन ट्यूटोरियल को देखने जा रहा हूं। – davidahines

2

सिद्धांत पर, मुझे लगता है कि रॉबिन ने आपके प्रश्न का उत्तर अच्छा दिया है। तो नीचे किया गया कार्यान्वयन है जो मैंने किया है। संक्षेप में, कार्यान्वयन में शीर्ष दो लेबल और नीचे दो स्क्रॉलपैन शामिल हैं, बाएं से दाएं खींचें। आयात होने से पहले अभी भी मामूली बात है, एक संवाद प्रकट होना चाहिए और उपयोगकर्ता से पूछना चाहिए कि कितनी मात्रा में गिरावट है (और फिर अंकगणितीय ऑपरेशन करें) लेकिन मुझे लगता है कि यह आपका होमवर्क हो सकता है? ;-) अगर आपको और मदद की ज़रूरत है तो मुझे बताएं।

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.UnsupportedFlavorException; 
import java.io.IOException; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.SwingUtilities; 
import javax.swing.TransferHandler; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeModel; 
import javax.swing.tree.MutableTreeNode; 
import javax.swing.tree.TreePath; 

public class JTreeExample extends JPanel 
{ 
    private JTree tree; 
    private DefaultTreeModel treeModel; 


    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 

      @Override 
      public void run() 
      { 
       createAndShowGUI();    
      } 
     }); 
    } 

    private static void createAndShowGUI() 
    { 
     JFrame frame = new JFrame("My Warehouse"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JTreeExample newContentPane = new JTreeExample(); 
     newContentPane.setOpaque(true); 
     frame.setContentPane(newContentPane); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

    public JTreeExample() 
    { 
     setLayout(new GridLayout(1, 3)); 
     JLabel lbl_parts = new JLabel("PARTS TO BE SHIPPED");  
     tree = new JTree(getTreeModel()); 
     tree.setDragEnabled(true);   
     tree.setPreferredSize(new Dimension(200,400)); 
     JScrollPane scroll = new JScrollPane(); 
     scroll.setViewportView(tree); 

     JLabel lbl_ship = new JLabel("SHIPPING BOX"); 
     treeModel = getTreeModel(); 
     JTree secondTree = new JTree(treeModel); 
     secondTree.setPreferredSize(new Dimension(200,400));   
     secondTree.setTransferHandler(new TransferHandler() { 

      @Override 
      public boolean importData(TransferSupport support) 
      { 
       if (!canImport(support)) 
       { 
        return false; 
       } 

       JTree.DropLocation dl = (JTree.DropLocation) support.getDropLocation(); 

       TreePath path = dl.getPath(); 
       int childIndex = dl.getChildIndex(); 

       String data; 
       try 
       { 
        data = (String) support.getTransferable().getTransferData(DataFlavor.stringFlavor); 
       } 
       catch (UnsupportedFlavorException e) 
       { 
        return false;     
       } 
       catch (IOException e) 
       { 
        return false;     
       } 

       if (childIndex == -1) 
       { 
        childIndex = tree.getModel().getChildCount(path.getLastPathComponent()); 
       } 

       DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(data); 
       DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) path.getLastPathComponent(); 
       treeModel.insertNodeInto(newNode, parentNode, childIndex); 

       tree.makeVisible(path.pathByAddingChild(newNode)); 
       tree.scrollRectToVisible(tree.getPathBounds(path.pathByAddingChild(newNode))); 

       return true; 
      } 

      public boolean canImport(TransferSupport support) 
      { 
       if (!support.isDrop()) 
       { 
        return false;     
       } 

       support.setShowDropLocation(true); 
       if (!support.isDataFlavorSupported(DataFlavor.stringFlavor)) 
       { 
        System.err.println("only string is supported"); 
        return false;     
       } 

       JTree.DropLocation dl = (JTree.DropLocation) support.getDropLocation(); 

       TreePath path = dl.getPath(); 

       if (path == null) 
       { 
        return false;     
       } 
       return true; 
      }      
     }); 
     JScrollPane secondScroll = new JScrollPane(); 
     secondScroll.setViewportView(secondTree); 

     JPanel topPanel = new JPanel(new BorderLayout()); 
     topPanel.add(lbl_parts, BorderLayout.NORTH); 
     topPanel.add(scroll, BorderLayout.CENTER); 

     JPanel btmPanel = new JPanel(new BorderLayout()); 
     btmPanel.add(lbl_ship, BorderLayout.NORTH); 
     btmPanel.add(secondScroll, BorderLayout.CENTER); 

     add(topPanel); 
     add(btmPanel);   

    } 

    private static DefaultTreeModel getTreeModel() 
    { 
     MutableTreeNode root = new DefaultMutableTreeNode("15663-1");       

     DefaultMutableTreeNode cover = new DefaultMutableTreeNode("Cover"); 
     cover.insert(new DefaultMutableTreeNode("2x PEMS"), 0); 
     cover.insert(new DefaultMutableTreeNode("2x SCREWS"), 0); 
     root.insert(cover, 0); 

     DefaultMutableTreeNode base = new DefaultMutableTreeNode("Base"); 
     base.insert(new DefaultMutableTreeNode("4x SCREWS"), 0); 
     base.insert(new DefaultMutableTreeNode("4x HANDLES"), 0); 
     root.insert(base, 0); 

     DefaultTreeModel model = new DefaultTreeModel(root); 
     return model; 
    } 
} 
+0

यह समाधान तारों के लिए बहुत अच्छी तरह से काम करता है और मुझे दिखाता है कि आयातडेटा का एक अच्छा कार्यान्वयन क्या कर सकता है और आयात कर सकता है, लेकिन अगर मेरे नोड ऑब्जेक्ट्स (पार्ट्स) धारण कर रहे हैं तो क्या मुझे exportData को भी लागू करने की आवश्यकता नहीं है? – davidahines

+2

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

+0

यूप, यह पर्याप्त से अधिक है, मैंने खुद को बाकी काम किया। जो वास्तव में मुझे समझ में नहीं आया वह यह है कि इसे लागू करने/ओवरराइड करने के तरीके क्या हैं जैसे ऐसा लगता है कि ड्रैग और ड्रॉप करने के विभिन्न तरीके हैं। – davidahines

संबंधित मुद्दे