Проблема с копированием HTML из JEditorPane во внешние приложения

У меня возникают проблемы с копированием HTML из JEditorPane в системный буфер обмена и последующей вставкой в другие приложения:

  • OpenOffice 3.2 - пишет "Запрошенный формат буфера обмена недоступен"
  • Thunderbird 3.13 - ничего не делает при вставке
  • Firefox 3.6.9 — принимает обычный текст, но, например, в GMail «Создать письмо» ничего не делает при вставке.

У меня, кстати, WinXP. В других приложениях, таких как текстовые редакторы, MS Outlook, MS Word и т. д., все работает так, как ожидалось, т.е. я получаю обычный текст с удаленными HTML-тегами или отформатированный текст в соответствии с тем, какой mimetype требуется приложению.

Кто-нибудь знает, что случилось? Это проблема в Swing или в OpenOffice/Mozilla?

См. тестовое приложение ниже и попробуйте. Я также пытался использовать собственный Transferable, но как только я предоставляю DataFlavor с mimetype="text/html", он перестает работать в приложениях, упомянутых выше.

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

/**
 * Demonstrates problem with copy/paste between JEditorPane and OpenOffice/Thunderbird/Firefox.
 * 
 * @author martin
 */
public class HtmlCopyDemo extends JFrame
{
    public HtmlCopyDemo()
    {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        setSize(400, 400);

        final JEditorPane editor = new JEditorPane();
        editor.setContentType("text/html");
        editor.setText("<html><head></head><body>Here's some <b>formatted</b> <i>text</i></body></html>");
        add(editor, BorderLayout.CENTER);

        JPanel panel = new JPanel(new FlowLayout());
        add(panel, BorderLayout.NORTH);

        JButton button = new JButton("Copy");
        panel.add(button);
        button.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                editor.selectAll();
                editor.copy();
            }
        });

        final JComboBox combo = new JComboBox(new Object[]{"text/html", "text/plain"});
        panel.add(combo);
        combo.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                String text = editor.getText();
                editor.setContentType((String) combo.getSelectedItem());
                editor.setText(text);
            }
        });
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new HtmlCopyDemo().setVisible(true);
            }
        });
    }
}

person Uhlen    schedule 16.09.2010    source источник


Ответы (1)


Скорее всего проблема на стороне ресивера. (Я не могу быть уверен на 100%, так как у меня нет вашей среды.)

Добавьте Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); к actionPerformed вашей кнопки, и я увижу, что в буфере обмена есть нужные вещи с полным html:

<html>
  <head>

  </head>
  <body>
    Here's some <b>formatted</b> <i>text</i>
  </body>
</html>

Вставка в Word 2007 работает корректно.

person Geoffrey Zheng    schedule 16.09.2010
comment
Да, он отлично работает во всех приложениях, которые я тестировал, кроме OOo/Mozilla. Я нашел этот отчет об ошибке в Bugzilla, который, вероятно, является причиной: bugzilla.mozilla.org/show_bug .cgi?id=395218 - person Uhlen; 16.09.2010