chr*_*ixm 2 html java clipboard swing jtextarea
我有一个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();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
当用户选择一部分文本并按下CTRL + C然后我调用该类的copy()方法JTextArea.这将文本作为纯文本复制到系统剪贴板上,我丢失了我应用于文本的任何突出显示.我正在寻找能够将包含高亮的样式信息复制为"text/html"或"text/rtf"的能力.我相信我需要使用Transferable和DataFlavor类,但我正在努力把一些东西放在一起 - 我不知道如何从JTextArea正确的格式获取数据放到剪贴板上.
我基本上试图复制突出显示,然后将其粘贴到Microsoft Word或类似的应用程序中,突出显示完整.样式数据是否以正确的格式提供,还是我手动必须通过枚举所有高亮显示来构建HTML标记?
好吧,基本上,因为荧光笔只是"涂上" JTextArea并且实际上并没有调整文本的样式,所以你需要自己动手
基本上你需要:
简单...
import java.awt.Color;
import java.awt.Font;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.io.InputStream;
import java.io.Reader;
import java.io.StringBufferInputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.Highlighter;
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) {
Highlighter h = aMain.getHighlighter();
Highlighter.Highlight[] highlights = h.getHighlights();
StringBuilder sb = new StringBuilder(64);
sb.append("<html><body>");
boolean markedUp = false;
for (Highlighter.Highlight highlight : highlights) {
int start = highlight.getStartOffset();
int end = highlight.getEndOffset();
try {
String text = aMain.getDocument().getText(start, end - start);
sb.append("<span style = 'background-color: #FFC800'>");
sb.append(text);
sb.append("</span>");
markedUp = true;
} catch (BadLocationException ex) {
ex.printStackTrace();
}
}
sb.append("</body></html>");
if (markedUp) {
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(new HtmlSelection(sb.toString()), null);
}
}
});
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();
}
});
}
private static class HtmlSelection implements Transferable {
private static List<DataFlavor> htmlFlavors = new ArrayList<>(3);
static {
try {
htmlFlavors.add(new DataFlavor("text/html;class=java.lang.String"));
htmlFlavors.add(new DataFlavor("text/html;class=java.io.Reader"));
htmlFlavors.add(new DataFlavor("text/html;charset=unicode;class=java.io.InputStream"));
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
}
private String html;
public HtmlSelection(String html) {
this.html = html;
}
public DataFlavor[] getTransferDataFlavors() {
return (DataFlavor[]) htmlFlavors.toArray(new DataFlavor[htmlFlavors.size()]);
}
public boolean isDataFlavorSupported(DataFlavor flavor) {
return htmlFlavors.contains(flavor);
}
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
if (String.class.equals(flavor.getRepresentationClass())) {
return html;
} else if (Reader.class.equals(flavor.getRepresentationClass())) {
return new StringReader(html);
} else if (InputStream.class.equals(flavor.getRepresentationClass())) {
return new StringBufferInputStream(html);
}
throw new UnsupportedFlavorException(flavor);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我已将其粘贴到文本编辑器中并在浏览器中打开并粘贴到Word中
以上是基于复制jTable行及其网格线到excel/word文档