我拼命尝试在HTML模式下的JTextPane中实现自定义的复制/粘贴。
大部分工作正常,我使用EditorKit.write()获得html内容,然后使用editorKit.read()将其粘贴。完美世界。
但是,当我在编辑器中输入<p> test </p>
并尝试复制“ es”以获得<p> tesest </p>
,我获得了
<p>tes</p>
<p>es</p>
<p>t</p>
知道这一点后,我试图找到一种方法来粘贴“内联”应该是内联的部分,并在复制过程中将要阻塞的部分粘贴到块中。通常,
如果我有 :
<p>mon beau sapin</p>
<p>roi des forêts</p>
<p>que j'aime ta verdure</p>
如果我复制:
beau sapin</p>
<p>roi des forêts</p>
<p>que
并将其粘贴到“ mon”之后,我期望:
<p>mon beau sapin</p>
<p>roi des forêts</p>
<p>que beau sapin</p>
<p>roi des forêts</p>
<p>que j'aime ta verdure</p>
而我得到:
<p>mon</p>
<p>beau sapin</p>
<p>roi des forêts</p>
<p>que</p>
<p>beau sapin</p>
<p>roi des forêts</p>
<p>que j'aime ta verdure</p>
我尝试了各种方法,例如使用editorKit.insertHTML(但是应该放入哪种标记?)删除第一行和最后一行的
<p></p>
(EditorKit.read自己添加回去),然后逐行插入(大多数有时,我在另一个p
中获得了一个p
)等。但是真正的问题是无法在htmlDocument中编写所需的内容。如何在指定位置写
sapin</p> <p>roi
?EditorKit.read?它将添加
<p>sapin</p> <p>roi</p>
Editorkit.insertHTML吗?我需要精确包装一个标签...
我告诉你我最后的尝试:
private static void insertHTMLContent(JMathTextPane jtp, String html, int offset) {
Document doc = Jsoup.parse(html);
Elements elts = doc.body().children();
//unwrap the last and first element
if(elts.size()>2) { elts.last().unwrap(); }
if(elts.size()>=1) { elts.first().unwrap(); }
//We add a fake DIV element and remove it just at the next line
editorKit.insertHTML(jtp.htmlDoc, offset, "<div id='copie'>"+doc.body().html()+"</div>", 0, 0, HTML.Tag.DIV);
jtp.getHTMLdoc().setOuterHTML(jtp.getHTMLdoc().getElement("copie"),doc.body().html());
}
我无法显示结果:EditorKit.write尝试自行修复html。但是HTMLDocument完全混乱。
供您尝试:
public class Test {
private static JTextPane editor = new Editor();
private static JMenuBar menu = new Menu();
private static String clipboard = "";
private static Action copy = new Copy();
private static Action paste = new Paste();
public static void main(String[] args) {
JFrame f = new JFrame();
f.setContentPane(editor);
f.setJMenuBar(menu);
f.setSize(600, 400);
f.setVisible(true);
}
public static class Editor extends JTextPane {
public Editor() {
this.setDocument(new HTMLDocument());
this.setEditorKit(new HTMLEditorKit());
}
}
public static class Menu extends JMenuBar {
public Menu() {
add(new JButton(copy));
add(new JButton(paste));
getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK), "copy");
getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_DOWN_MASK), "paste");
getActionMap().put("copy", copy);
getActionMap().put("paste", paste);
}
}
public static class Copy extends AbstractAction {
public Copy() {super("copy");}
@Override
public void actionPerformed(ActionEvent e) {
StringWriter w = new StringWriter();
try {
editor.getEditorKit().write(w, editor.getDocument(), editor.getCaretPosition(), editor.getSelectedText().length());
} catch (Exception ex) {Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);}
clipboard = w.toString();
}
}
public static class Paste extends AbstractAction {
public Paste() {super("paste");}
@Override
public void actionPerformed(ActionEvent e) {
try {
editor.getEditorKit().read(new StringReader(clipboard), editor.getDocument(), editor.getCaretPosition());
} catch (Exception ex) {Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);}
}
}
}
抱歉,我很长。我接受任何帮助。
最佳答案
恐怕没有简单的方法。粘贴时,您希望保留原始段落并避免创建新的<p>
,对吗?问题是当前段落,复制的段落可能具有不同的属性。例如。当前是左对齐的,但是复制的一个是右对齐的。
该案如何解决?为了简化此工具包,只需创建<p>
元素。
您可以尝试从剪贴板内容创建一个独立的HTMLDocument,然后遍历Document的结构,提取元素(段落和文本)并将其插入原始文档中。