我有一个 JTextArea
,我正在使用 Highlighter
根据我的SSCCE在我的部分文本中应用一些语法高亮:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
public class SSCCE extends JFrame {
public SSCCE() {
final JTextArea aMain = new JTextArea();
aMain.setFont(new Font("Consolas", Font.PLAIN, 11));
aMain.setMargin(new Insets(5, 5, 5, 5));
aMain.setEditable(false);
add(aMain);
aMain.setText("The quick brown fox jumped over the lazy dog.");
Highlighter h = aMain.getHighlighter();
try {
h.addHighlight(10, 15, new DefaultHighlighter.DefaultHighlightPainter(new Color(0xFFC800)));
}
catch (BadLocationException e) {
e.printStackTrace();
}
aMain.getActionMap().put("Copy", new AbstractAction() {
public void actionPerformed(ActionEvent e) {
aMain.copy();
}
});
aMain.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "Copy");
setTitle("SSCCE");
setSize(350, 150);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new SSCCE();
}
});
}
}
当用户选择一部分文本并按CTRL C然后我调用 JTextArea
类的 copy()
方法 . 这将文本作为纯文本复制到系统剪贴板上,我丢失了我应用于文本的任何突出显示 . 我正在寻找能够将包含高亮的样式信息复制为"text/html"或"text/rtf"的功能 . 我相信我需要使用 Transferable
和 DataFlavor
类,但我正在努力将某些内容放在一起 - 我不知道如何以正确的格式从 JTextArea
获取数据以放置到剪贴板上 .
我基本上试图复制突出显示,然后将其粘贴到Microsoft Word或类似的应用程序中,突出显示完整 . 样式数据是否以正确的格式提供,还是我手动必须通过枚举所有高亮显示来构建HTML标记?
2 回答
好吧,基本上,因为荧光笔在
JTextArea
上只是"painted"并且实际上并没有调整文本的样式,所以你需要自己动手基本上你需要:
获取所有当前要点的列表
从文档中提取文本
包装html
创建合适的基于HTML的可转让
将html标记复制到剪贴板
简单...
我已将其粘贴到文本编辑器中并在浏览器中打开并粘贴到Word中
以上是基于Copy jTable row with its grid lines into excel/word documents
根据MadProgrammer的答案,从概念的角度来看,这是一个现实,并使我能够提出以下建议 . 两个答案之间的唯一区别是我对多个DataFlavor的支持,因此
text/plain
被复制以及text/html
味道 . 我还提供了一个改进的HTML标记例程,其中包含一个突出显示但在选择范围内的文本 .UPDATE 1 :我的原始答案没有处理嵌套突出显示的情况 - 现在可以使用解决方案将
JTextArea
中任何突出显示的文本导出到支持text/html
或text/plain
的任何应用程序 .UPDATE 2 :现在添加了对所有不同类DataFlavor _1850489的建议的支持 . 如果我们有重叠突出显示从同一位置开始,我也修复了一个问题 .