2011-10-12 9 views
14

मैं इस समस्या को प्रदर्शित करने के लिए इस कोड है: आप सभी पाठ है कि एक बार एप्लिकेशन शुरू होता है फ्रेम में प्रकट होता है का चयन करते हैंबनाना क्लिपबोर्ड में एचटीएमएल डाल सही ढंग से स्वरूपित पाठ के साथ एक JEditorPane

public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    frame.getContentPane().add(new JEditorPane("text/html", "Hello cruel world<br>\n<font color=red>Goodbye cruel world</font><br>\n<br>\nHello again<br>\n")); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
} 

, आप इसे कॉपी कर सकते हैं और इसे एमएस वर्ड, ऐप्पल के पेज, या मेल में पेस्ट करें और टेक्स्ट सही ढंग से स्वरूपित है। लेकिन यदि आप टेक्स्ट एडिट, स्माल्ट्रॉन या स्काइप चैट विंडो जैसे शुद्ध टेक्स्ट एडिटर में पेस्ट करते हैं तो सभी चिपकाए गए सामग्री एक पंक्ति पर होती है।

क्लिपबोर्ड पर पाठ की प्रतिलिपि बनाने के लिए मैं क्या कर सकता हूं ताकि संरक्षित न्यूलाइन के साथ चिपकाया जा सके?

मैं Mac OS X 10.7

+0

यह हो सकता है कि TextEdit बस उस तरह बातें प्रदर्शित नहीं होता है? क्या होता है जब आप इसे किसी अन्य टेक्स्ट एडिटर में पेस्ट करते हैं? –

+0

@ शेकडाउन, समस्या अन्य सादा पाठ संपादकों के साथ है, जैसे Smultron –

+0

+1 अच्छा प्रश्न, उत्तर – mKorbel

उत्तर

19

पर अपने कोड चल रहा हूँ कोई जवाब मिलने के बाद, मैं अपने आस्तीन लुढ़का और अनुसंधान और शिक्षा का एक बहुत कुछ किया। समाधान घटक के लिए कस्टम ट्रांसफर हैंडलर बनाना है, और मैन्युअल रूप से HTML टेक्स्ट को मालिश करना है। यह सब काम करना आसान नहीं था, जो मुझे मिलने वाले शून्य उत्तरों के लिए जिम्मेदार ठहरा सकता था।

import javax.swing.*; 
import javax.swing.text.MutableAttributeSet; 
import javax.swing.text.html.HTML; 
import javax.swing.text.html.HTMLEditorKit; 
import javax.swing.text.html.parser.ParserDelegator; 
import java.awt.datatransfer.Clipboard; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.Transferable; 
import java.awt.datatransfer.UnsupportedFlavorException; 
import java.io.IOException; 
import java.io.Reader; 
import java.io.StringReader; 
import java.util.ArrayList; 

public class ScratchSpace { 

    public static void main(String[] args) { 
     final JFrame frame = new JFrame(); 
     final JEditorPane pane = new JEditorPane("text/html", "<html><font color=red>Hello</font><br>\u2663<br>World"); 
     pane.setTransferHandler(new MyTransferHandler()); 
     frame.getContentPane().add(pane); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

} 

class MyTransferHandler extends TransferHandler { 

    protected Transferable createTransferable(JComponent c) { 
     final JEditorPane pane = (JEditorPane) c; 
     final String htmlText = pane.getText(); 
     final String plainText = extractText(new StringReader(htmlText)); 
     return new MyTransferable(plainText, htmlText); 
    } 

    public String extractText(Reader reader) { 
     final ArrayList<String> list = new ArrayList<String>(); 

     HTMLEditorKit.ParserCallback parserCallback = new HTMLEditorKit.ParserCallback() { 
      public void handleText(final char[] data, final int pos) { 
       list.add(new String(data)); 
      } 

      public void handleStartTag(HTML.Tag tag, MutableAttributeSet attribute, int pos) { 
      } 

      public void handleEndTag(HTML.Tag t, final int pos) { 
      } 

      public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a, final int pos) { 
       if (t.equals(HTML.Tag.BR)) { 
        list.add("\n"); 
       } 
      } 

      public void handleComment(final char[] data, final int pos) { 
      } 

      public void handleError(final String errMsg, final int pos) { 
      } 
     }; 
     try { 
      new ParserDelegator().parse(reader, parserCallback, true); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     String result = ""; 
     for (String s : list) { 
      result += s; 
     } 
     return result; 
    } 


    @Override 
    public void exportToClipboard(JComponent comp, Clipboard clip, int action) throws IllegalStateException { 
     if (action == COPY) { 
      clip.setContents(this.createTransferable(comp), null); 
     } 
    } 

    @Override 
    public int getSourceActions(JComponent c) { 
     return COPY; 
    } 

} 

class MyTransferable implements Transferable { 

    private static final DataFlavor[] supportedFlavors; 

    static { 
     try { 
      supportedFlavors = new DataFlavor[]{ 
        new DataFlavor("text/html;class=java.lang.String"), 
        new DataFlavor("text/plain;class=java.lang.String") 
      }; 
     } catch (ClassNotFoundException e) { 
      throw new ExceptionInInitializerError(e); 
     } 
    } 

    private final String plainData; 
    private final String htmlData; 

    public MyTransferable(String plainData, String htmlData) { 
     this.plainData = plainData; 
     this.htmlData = htmlData; 
    } 

    public DataFlavor[] getTransferDataFlavors() { 
     return supportedFlavors; 
    } 

    public boolean isDataFlavorSupported(DataFlavor flavor) { 
     for (DataFlavor supportedFlavor : supportedFlavors) { 
      if (supportedFlavor == flavor) { 
       return true; 
      } 
     } 
     return false; 
    } 

    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { 
     if (flavor.equals(supportedFlavors[0])) { 
      return htmlData; 
     } 
     if (flavor.equals(supportedFlavors[1])) { 
      return plainData; 
     } 
     throw new UnsupportedFlavorException(flavor); 
    } 
} 
1

अपने कोड पोस्ट के लिए धन्यवाद:

यहाँ एक काम समाधान है! मैं एक ऐप प्राप्त करने और जेएनएलपी के तहत चलने पर काम कर रहा हूं जो उपयोगकर्ता को विधायक उद्धरण बनाने की अनुमति देता है और फिर उन्हें एक वर्ड प्रोसेसर में कॉपी/पेस्ट करता है। तो प्रारूपण को संरक्षित करने की जरूरत है।

http://proctinator.com/citation/

एक आसान तरीका है देखें, लेकिन मुझे लगता है कि मैं दृष्टिकोण की तरह आप ऊपर प्रदर्शित jnlp के साथ काम कर अपने आवेदन प्राप्त करने के लिए की आवश्यकता होगी।

नीचे दिया गया कोड एक जेनरेटरपेन के लिए एक अप्रतिबंधित वातावरण में चल रहा है। (जैसे एक एप्लेट या JNLP फ़ाइल है कि पूर्ण अनुमति का अनुरोध नहीं किया के लिए मामला होगा के रूप में।) लेकिन कॉपी/पेस्ट नहीं सीधे उपलब्ध है जब आप अनुप्रयोग है सैंडबॉक्स में है

JEditorPane citEditorPane; 
//user fills pane with MLA citations. 
citEditorPane.selectAll(); 
citEditorPane.copy(); 
citEditorPane.select(0, 0); 
+0

सैंडबॉक्स में वेबस्टेस्टेबल के लिए अनुमति की प्रतिलिपि बनाने के लिए, मेरी उत्तर-उत्तर-उत्तर-टिप्पणी :-) – kleopatra

3

नोट: इस नहीं है प्रश्न का उत्तर, सुरक्षा प्रतिबंधों से संबंधित @Thorn द्वारा उत्तर के साथ कोड के साथ एक टिप्पणी,

डिफ़ॉल्ट अनुमतियों के साथ वेबस्टेबल्स में (यानी, कोई नहीं ;-) आप सुरक्षा प्रबंधक को क्लिपबोर्ड सेवा के लिए रनटाइम पर पूछ सकते हैं: यह प्रतिलिपि पॉप-अप करेगा जिसे उपयोगकर्ता को प्रतिलिपि (या अस्वीकार) करने की अनुमति देने के लिए कहा जाता है। इसके साथ, आप textComponent में डिफ़ॉल्ट प्रतिलिपि कार्रवाई को प्रतिस्थापित कर सकते हैं। SwingX demo हम स्रोत क्षेत्र से कोड पेस्ट करने का समर्थन करते हैं:

/** 
* Replaces the editor's default copy action in security restricted 
* environments with one messaging the ClipboardService. Does nothing 
* if not restricted. 
* 
* @param editor the editor to replace 
*/ 
public static void replaceCopyAction(final JEditorPane editor) { 
    if (!isRestricted()) return; 
    Action safeCopy = new AbstractAction() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      try { 
       ClipboardService cs = (ClipboardService)ServiceManager.lookup 
        ("javax.jnlp.ClipboardService"); 
       StringSelection transferable = new StringSelection(editor.getSelectedText()); 
       cs.setContents(transferable); 
      } catch (Exception e1) { 
       // do nothing 
      } 
     } 
    }; 
    editor.getActionMap().put(DefaultEditorKit.copyAction, safeCopy); 
} 

private static boolean isRestricted() { 
    SecurityManager manager = System.getSecurityManager(); 
    if (manager == null) return false; 
    try { 
     manager.checkSystemClipboardAccess(); 
     return false; 
    } catch (SecurityException e) { 
     // nothing to do - not allowed to access 
    } 
    return true; 
} 
संबंधित मुद्दे