JEditorPaneからシステムクリップボードにHTMLをコピーしてから、他のアプリケーションに貼り付けるのに問題があります。
- OpenOffice3.2-「要求されたクリップボード形式は利用できません」と言います
- Thunderbird3.13-貼り付けには何もしません
- Firefox 3.6.9-プレーンテキストを受け入れますが、たとえばGMailでは「メールの作成」は貼り付けに何もしません
ちなみに私はWinXPを実行しています。テキストエディタ、MS Outlook、MS Wordなどの他のアプリケーションでは、期待どおりに機能します。つまり、アプリケーションが必要とするmimetypeに応じて、HTMLタグが削除またはフォーマットされたテキストを含むプレーンテキストを取得します。
誰もが何が悪いのか考えていますか?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);
}
});
}
}