2013-01-11 6 views
6

मैं उसी एप्लिकेशन के विभिन्न उदाहरणों के बीच ऑब्जेक्ट्स की कॉपी-पेस्ट को कार्यान्वित करने की कोशिश कर रहा हूं। वर्तमान में यह केवल एक आवेदन में काम करता है (मेरा मतलब है, आवेदन के उसी उदाहरण में कॉपी और पेस्ट करें), लेकिन विभिन्न उदाहरणों के बीच काम नहीं करता है।जावा: उसी एप्लिकेशन के विभिन्न उदाहरणों के बीच जावा ऑब्जेक्ट्स कॉपी करने के लिए क्लिपबोर्ड का उपयोग करें

प्रतिलिपि बनाई जा रही कोड:

// MyObject is a class of objects I want to copy/paste; 
// MyObjectSelection is a class that impements Transferable and ClipboardOwner interfaces 

Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 
MyObject data = new MyObject(selectedItems); 
MyObjectSelection dataSelection = new MyObjectSelection(data); 
clipboard.setContents(dataSelection, this); 

उसके बाद, मैं क्लिपबोर्ड की सामग्री की जाँच कर सकते हैं, इस तरह:

Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 
Transferable clipboardContent = clipboard.getContents(this); 

DataFlavor[] flavors = clipboardContent.getTransferDataFlavors(); 
System.out.println("flavors.length=" + flavors.length); 
for (int i = 0; i < flavors.length; i++){ 
    System.out.println("flavor=" + flavors[i]); 
} 

मैं एक ही आवेदन उदाहरण है कि मैं वस्तु की नकल की से ऐसा करते हैं तो यह, काम करता है: flavors.length1 है, mimetype application/x-java-serialized-object है, और, ठीक है, यह काम करता है।

लेकिन अगर मैं अनुप्रयोग खोलें, कॉपी करते हैं, तो एक ही आवेदन फिर से (पहले एक बंद नहीं है, अर्थात दोनों मामलों एक साथ चल रहे हैं) खोलने के लिए, और वहाँ से क्लिपबोर्ड सामग्री की जाँच करने के लिए प्रयास करते हैं, तो flavors.length0 है।

मैंने दस्तावेज़ों और इन उदाहरणों की जांच की: one, two, लेकिन मुझे अभी भी पता नहीं है कि मेरे कार्यान्वयन में क्या गलत है।

क्या मुझे कुछ याद आया?


युपीडी: clipboard_test.zip: मैं sscce गयी।

इस परीक्षा आवेदन (मैं ग्रहण का उपयोग यह निर्माण करने के लिए) 3 स्रोत फ़ाइलों के साथ है: - मुख्य अनुप्रयोग वर्ग

  • MyObject.java -

    • ClipboardTest.java कॉपी करने के लिए वस्तुओं के लिए वर्ग/पेस्ट (इस वर्ग के सिर्फ सरणी शामिल String का)
    • MyObjectSelection.java - वर्ग कि Transerable और ClipboardOwner इंटरफेस

      लागू करता है वहाँ tw हैं ओ बटन: "कॉपी", "परीक्षण"।

      जब आप "प्रतिलिपि" बटन दबाते हैं, तो MyObject का नया उदाहरण बनाया गया है और क्लिपबोर्ड पर रखा गया है।

      जब आप प्रेस "परीक्षण" बटन, क्लिपबोर्ड सामग्री जाँच कर रहे हैं और गूँजती कंसोल के लिए (समर्थित DataFlavor की की गिनती, और प्रत्येक DataFlavor)

      तो, इन चरणों का दोहराने:

    • प्रारंभ आवेदन

    • प्रेस "प्रतिलिपि" बटन: आप लॉग में "object copied" संदेश देखेंगे
    • "परीक्षण" बटन प्रेस: ​​आप क्लिपबोर्ड की सामग्री को देखेंगे :

      flavors.length = 1 
          flavor[0] = java.awt.datatransfer.DataFlavor[mimetype=application/x-java-serialized-object;representationclass=MyObject] 
      
    • आवेदन का एक और उदाहरण प्रारंभ करें (बंद नहीं करते पहले एक)

    • प्रेस "परीक्षण" बटन:

      flavors.length = 0 
      
    : आपको लगता है कि क्लिपबोर्ड खाली है देखेंगे

    वह क्यों है?


    UPD2: sscce सीधे यहां पोस्ट:

    import java.awt.BorderLayout; 
    
        import java.awt.datatransfer.Clipboard; 
        import java.awt.datatransfer.ClipboardOwner; 
        import java.awt.datatransfer.DataFlavor; 
        import java.awt.datatransfer.Transferable; 
        import java.awt.datatransfer.UnsupportedFlavorException; 
    
        import java.awt.event.ActionEvent; 
        import java.awt.event.ActionListener; 
    
        import java.awt.Toolkit; 
    
        import javax.swing.JButton; 
        import javax.swing.SwingUtilities; 
        import javax.swing.JFrame; 
    
        public final class ClipboardTest implements Runnable, ClipboardOwner { 
    
        public static void main(String[] args) { 
         SwingUtilities.invokeLater (new ClipboardTest()); 
        } 
    
        public void run() { 
    
         JFrame f = new JFrame ("Clipboard test"); 
         f.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE); 
    
         //-- Create "copy" button. 
         // When you click it, new object "test_items" becomes created 
         // and put to the clipboard. 
         { 
          JButton button_copy = new JButton("copy"); 
          button_copy.addActionListener(new ActionListener(){ 
           public void actionPerformed(ActionEvent e){ 
    
           String[] test_items = { 
            "one", "two", "three" 
           }; 
    
           Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 
           MyObject data = new MyObject(test_items); 
           MyObjectSelection dataSelection = new MyObjectSelection(data); 
           clipboard.setContents(dataSelection, ClipboardTest.this); 
    
           System.out.println("object copied"); 
           } 
          }); 
          f.add(button_copy, BorderLayout.NORTH); 
         } 
    
         //-- Create "test" button. 
         // When you click it, clipboard contents are checked 
         // and echoed to the console (count of supported DataFlavor's, and each DataFlavor) 
         { 
          JButton button_test = new JButton("test"); 
          button_test.addActionListener(new ActionListener(){ 
           public void actionPerformed(ActionEvent e){ 
    
           Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 
           Transferable clipboardContent = clipboard.getContents(this); 
    
           DataFlavor[] flavors = clipboardContent.getTransferDataFlavors(); 
           System.out.println("flavors.length = " + flavors.length); 
           for (int i = 0; i < flavors.length; i++){ 
            System.out.println("flavor[" + i + "] = " + flavors[i]); 
           } 
    
           } 
          }); 
          f.add(button_test, BorderLayout.SOUTH); 
         } 
    
         f.pack(); 
         f.setVisible(true); 
        } 
    
    
    
        // ClipboardOwner implementation 
    
        @Override 
        public void lostOwnership(Clipboard clipboard, Transferable transferable){ 
         System.out.println("ClipboardTest: Lost ownership"); 
        } 
    
    
    
    
    
    
    
        /* ***************************************************************************************** 
         * Object that I want to copy/paste 
         * ****************************************************************************************/ 
    
        public static class MyObject { 
    
         private String[] items; 
    
         public MyObject(String[] items){ 
          this.setItems(items); 
         } 
    
         public String[] getItems(){ 
          return this.items; 
         } 
    
         public void setItems(String[] items){ 
          this.items = items; 
         } 
    
        } 
    
    
    
    
        public static class MyObjectSelection implements Transferable, ClipboardOwner { 
    
         private static DataFlavor dmselFlavor = new DataFlavor(MyObject.class, "Test data flavor"); 
         private MyObject selection; 
    
    
    
         public MyObjectSelection(MyObject selection){ 
          this.selection = selection; 
         } 
    
    
         // Transferable implementation 
    
         @Override 
         public DataFlavor[] getTransferDataFlavors(){ 
          System.out.println("getTransferDataFlavors"); 
          DataFlavor[] ret = {dmselFlavor}; 
          return ret; 
         } 
    
         @Override 
         public boolean isDataFlavorSupported(DataFlavor flavor){ 
          return dmselFlavor.equals(flavor); 
         } 
    
         @Override 
         public synchronized Object getTransferData (DataFlavor flavor) 
          throws UnsupportedFlavorException 
         { 
          if (isDataFlavorSupported(flavor)){ 
           return this.selection; 
          } else { 
           throw new UnsupportedFlavorException(dmselFlavor); 
          } 
         } 
    
    
    
         // ClipboardOwner implementation 
    
         @Override 
         public void lostOwnership(Clipboard clipboard, Transferable transferable){ 
          System.out.println("MyObjectSelection: Lost ownership"); 
         } 
    
        } 
    
        } 
    
  • +3

    जल्द से जल्द बेहतर सहायता के लिए, एक [एसएससीसीई] (http://sscce.org/) पोस्ट करें। –

    +0

    ऑपरेटिंग सिस्टम और JVM के स्टार्टअप तर्क/विन्यास भी वैश्विक क्लिपबोर्ड – tucuxi

    +0

    @AndrewThompson तक पहुँचने पर कहने के लिए बहुत कुछ है, मैं इसे, मेरे अद्यतन सवाल जाँच गयी। –

    उत्तर

    5

    का हवाला देते हुए this tutorial:

    इस तंत्र का उपयोग कर डेटा स्थानांतरित करना, Object क्रमबद्धता का उपयोग करता है तो वर्ग आप स्थानांतरित करने के लिए उपयोग डेटा को Serializable इंटरफ़ेस को कार्यान्वित करना होगा, जैसा कि इसके साथ क्रमबद्ध किया जाना चाहिए। यदि सबकुछ क्रमिक नहीं है, तो आप क्लिपबोर्ड पर ड्रॉप या कॉपी के दौरान NotSerializableException देखेंगे।

    आपका MyObjectSerializable नहीं है, इसलिए यह काम नहीं कर सकते हैं। (के रूप में एक serializable माता पिता वर्ग, या इसी तरह के परिदृश्यों जहां गैर serializability केवल प्रक्रिया में पता चला है की एक unserializable उपवर्ग के साथ एक स्थिति के खिलाफ) ढांचे जाहिरा तौर पर इस तथ्य का पता लगाता है, तो यह भी अन्य प्रक्रियाओं है कि स्वाद की पेशकश नहीं होंगे।

    सामान्यतः, उसी जावा एप्लिकेशन के दो उदाहरणों में एक ही पता स्थान नहीं होगा, इसलिए वे आसानी से एक दूसरे की स्मृति तक नहीं पहुंच सकते हैं। इसलिए आपके द्वारा स्थानांतरित की जाने वाली प्रत्येक चीज़ को क्रमबद्ध किया जाना चाहिए।

    +0

    बहुत बहुत धन्यवाद। दुर्भाग्यवश, मुझे आधिकारिक 'डेटाफ्लॉवर' दस्तावेज़ से इस ट्यूटोरियल का लिंक नहीं मिल रहा है: http://docs.oracle.com/javase/7/docs/api/java/awt/datatransfer/DataFlavor.html –

    +0

    @DmitryFrank: वह लिंक मर चुका है, मैंने अभी इसके लिए एक बग रिपोर्ट दायर की है। लेकिन शीर्षक का उपयोग करके, मैंने संदर्भित संस्करण को ढूंढना बहुत आसान था। – MvG

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

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