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
そして、「月」の後に貼り付けてください。
<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>
<p></p>
最初と最後の行を削除する(EditorKit.readがそれを元に戻す)、editorKit.insertHTMLを使用する(しかし、どのようなタグを付けるべきか)、行ごとに挿入する(ほとんどの場合)など、さまざまなアプローチを試しました、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);}
}
}
}
すみません、長くなってしまいました。私はどんな助けも受け入れます。