1

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);}
    }
}
}

すみません、長くなってしまいました。私はどんな助けも受け入れます。

4

2 に答える 2

1

簡単な方法はないのではないかと心配しています。<p>貼り付けるときは、元の段落を維持し、新しい作成を避けたいと思いませんか? 問題は現在の段落であり、コピーされた段落には異なる属性がある可能性があります。たとえば、現在は左揃えですが、コピーされたものは右揃えになります。

ケースを解決するにはどうすればよいですか?このキットを単純化するために、<p>要素を作成するだけです。

クリップボードのコンテンツから独立した HTMLDocument を作成し、要素 (段落とテキスト) を抽出して元のドキュメントに挿入するドキュメントの構造を反復処理することができます。

于 2013-07-04T05:34:23.357 に答える