3

HTML JEditorPane に空の行があると、以前に設定されたすべてのスタイリングがなくなることに気付きました。たとえば、次のコード サンプルを参照してください。

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.text.AttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.html.HTMLEditorKit;


public class BlankLineTester {
    private JEditorPane jep;

    public BlankLineTester() {
        String html = "<html><head></head><body>" +
                "<p><b>Line 1</b></p>" +
                "<p><b></b></p>" +
                "<p><b>Line 3</b></p>" +
                "</body></html>";

        jep = new JEditorPane();
        jep.setContentType("text/html");
        jep.setText(html);

        JFrame frame = new JFrame("Blank Line Test");
        frame.getContentPane().add(jep);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        System.out.println("Line 3 is " + isInputAttributeBold());

        jep.getCaret().setDot(8);
        System.out.println("Line 2 is " + isInputAttributeBold());

    }

    private boolean isInputAttributeBold() {
        AttributeSet attSet = ((HTMLEditorKit)jep.getEditorKit()).getInputAttributes();
        return StyleConstants.isBold(attSet);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new BlankLineTester();
            }
        });
    }
}

行 2 は、最初は太字の空の行として設定されていますが、解析後、太字の属性が保持されていないようです。また、これを自分で実行し、カーソルを 3 行目に置き、その行のすべてを削除すると、次に入力する文字が太字にならないことに注意してください。HTMLDocument ツリーのリーフ要素は、それらが表すテキストがなくなると削除されると思いますが、ユーザーが実行するとバグのある動作のように見え始めます。

スタイリング属性を空の行で解析し、スタイル付きの行のすべてが削除されたときに保持する方法を知っている人はいますか?

ありがとう!--アンディ

4

1 に答える 1

3

あなたのやり方で書くのではなく、このように書くと、あなたの振る舞いが得られると思いますb & /b.タグは古いスタイルですが、私はJRE 1.7 update 3を使用しています.

String html = "<html><head></head><body>" +
                "<p style = \"font-weight:bold\">Line 1</p>" +
                "<p style = \"font-weight:bold\"></p>" +
                "<p style = \"font-weight:bold\">Line 3</p>" +
                "</body></html>";

このコードを試してください。プログラムを実行し、カーソルを最初に持ってきて押してみてください。その後、マウスポインターが最後に触れた文字の色であるDeleteColor GREENを保持し、カーソルを持って押してみてください。最後まで、マウスポインターが最後に触れた文字の色であるため、Color BLUEが保持されます。3 回目は、既に提供されている 2 つの行の間の各行に単語を書き込んでみてください。文字を赤で表示する行が 1 つあります。その行を見つけてみてください。赤い線のシナリオを明確にするために、下の画像を添付しています。Backspace

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.text.AttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.html.HTMLEditorKit;


public class BlankLineTester {
    private JEditorPane jep;

    public BlankLineTester() {
        String html = "<html><head></head><body>" +
                "<p style = \"font-weight:bold; color: blue\">Line 1</p><br />" +
                "<p style = \"font-weight:bold; color: red\"></p><br />" +
                "<p style = \"font-weight:bold; color: green\">Line 3</p>" +
                "</body></html>";

        jep = new JEditorPane();
        jep.setContentType("text/html");
        jep.setText(html);

        JFrame frame = new JFrame("Blank Line Test");
        frame.getContentPane().add(jep);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        System.out.println("Line 3 is " + isInputAttributeBold());

        jep.getCaret().setDot(8);
        System.out.println("Line 2 is " + isInputAttributeBold());

    }

    private boolean isInputAttributeBold() {
        AttributeSet attSet = ((HTMLEditorKit)jep.getEditorKit()).getInputAttributes();
        return StyleConstants.isBold(attSet);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new BlankLineTester();
            }
        });
    }
}

フォントスタイル

于 2012-04-12T04:45:06.150 に答える