【问题标题】:Copying from a website into a JTextPane is giving me unwanted formatting and html tags从网站复制到 JTextPane 给了我不需要的格式和 html 标签
【发布时间】:2012-10-29 06:23:01
【问题描述】:

这里是一些背景信息:

我有一个扩展 JTextPane 的类,当您将文本从网站复制到其中时,它会给我不需要的格式元素和标签。 iframe、字体等。JTextPane 的类型是 html/text 并且需要保持这种方式,因为我在代码的另一部分将链接更改为可点击的链接。

据我所知,当我从网络复制并粘贴到 JTextPane 时,它​​会自动尝试保持格式设置,我不希望这种情况发生。

要记住一些事情,我正在使用 HTMLEditorKit,我不想在我的存储库中添加另一个大型工具。有没有一种简单的方法可以让我只获取文本而不是所有元素和格式来粘贴它?

【问题讨论】:

  • 你可以使用 DefaultEditorKit 代替 HTMLEditorKit
  • 在使用这个库时,有什么好的方法可以轻松剥离 html 吗?我知道很多人建议使用 html 解析器,但我试图避免添加大量笨重的库。我试图避免在这个上重新发明轮子。

标签: java html swing paste jtextpane


【解决方案1】:

我建议你开始:

    editorKit = new HTMLEditorKit();
    setEditorKit(editorKit);

    htmlDoc = (HTMLDocument) editorKit.createDefaultDocument();
    htmlDoc.setPreservesUnknownTags(false);

然后你可以使用:

    DataFlavor htmlFlavor = new DataFlavor("text/html;class=java.lang.String");

    String html = (String) clipboard.getData(htmlFlavor);
    editorKit.read(new StringReader(html), htmlDoc, 0);

剩下的交给你自己。但如果您使用 HTML,我真的建议您使用 JSoup。它非常轻巧,非常强大且非常有用!

【讨论】:

    【解决方案2】:

    如果您不想使用 DefaultEditorKit,而只想将文本复制粘贴到 HtmlEditorKit,您可以尝试编写自己的粘贴代码,

    textPane.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.CTRL_MASK), "paste");
    
    textPane.getActionMap().put("paste", pasteAction);
    
    class PasteAction extends AbstractAction {
    
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    int offset = textPane.getSelectionStart();
                    Document sd=textPane.getDocument();
                    String value = getClipboard();
                    sd.remove(textPane.getSelectionStart(), textPane.getSelectionEnd()-textPane.getSelectionStart());
                    textPane.getDocument().insertString(offset, value , null);
                    if (value != null) {
                        textPane.setCaretPosition(offset + value.length());
                    }
                } catch (Exception exc) {
                    exc.printStackTrace();
                }
            }
    
    }
    

    并使用此代码从剪贴板中获取纯文本,

    public String getClipboard() throws ClassNotFoundException, UnsupportedFlavorException {
        Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
        DataFlavor htmlStringFlavor = new DataFlavor("text/plain; class=java.lang.String");
        try {
            if (t != null && t.isDataFlavorSupported(htmlStringFlavor)) {
                String text = (String) t.getTransferData(htmlStringFlavor);
                return text;
            }
        } catch (UnsupportedFlavorException e) {
        } catch (IOException e) {
        }
        return null;
    }
    

    如果您有菜单项、工具栏或其他触发器,请不要忘记将“粘贴”操作绑定到它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-19
      • 1970-01-01
      • 2012-07-20
      • 2012-04-02
      • 1970-01-01
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多