Making a JEditorPane with html put correctly formatted text in clipboard

后端 未结 3 1921
一向
一向 2020-12-31 06:59

I have this code to demonstrate the problem:

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.getContentPane().add(new JEd         


        
3条回答
  •  一生所求
    2020-12-31 07:24

    After getting no answers, I rolled up my sleeves and did a lot of research and learning. The solution is to make a custom TransferHandler for the component, and massage the HTML text manually. It wasn't easy to work all this out, which could account for the zero answers I got.

    Here's a working solution:

    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", "Hello
    \u2663
    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 list = new ArrayList(); 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); } }

提交回复
热议问题