3

JTextPane を使用して HTML を編集しています。GUI コンポーネントに改行を入力し、JTextPane で getText() を呼び出すと、改行文字を含む文字列が取得されます。次に、新しい JTextPane を作成して同じテキストを渡すと、改行は無視されます。

改行が入力されたときに JTextPane が <br> タグを挿入しないのはなぜですか? これに対する適切な回避策はありますか?

    JTextPane test = new JTextPane();
    test.setPreferredSize(new Dimension(300, 300));
    test.setContentType("text/html");
    test.setText("Try entering some newline characters.");
    JOptionPane.showMessageDialog(null, test);
    String testText = test.getText();
    System.out.println("Got text: " + testText);
    // try again
    test.setText(testText);
    JOptionPane.showMessageDialog(null, test);
    testText = test.getText();
    System.out.println("Got text: " + testText);        

出力例:

<html>
  <head>

  </head>
  <body>
    Try entering some newline characters.
What gives?
  </body>
</html>

setText を呼び出す前に改行を HTML の改行に変換できることはわかっていますが、そうすると HTML タグと BODY タグの後の改行も変換されてしまい、ばかげているように思えます。

4

3 に答える 3

8

私はこれを解決しました。問題は、setText で渡していたプレーン テキストでした。への呼び出しを取り出すとsetText、 の結果JTextPane.getText()は適切にフォーマットされ、改行が正しくエンコードされた HTML になります。

呼び出すと、 「\ n」JTextPane.setText("Try entering some newline characters")に設定されると思います。HTMLDocument.documentProperties.__EndOfLine__このドキュメント プロパティ定数は、ここで定義されています。

<p>解決策は、テキストをJTextPane.setText() メソッドに渡すときに必ずタグでラップすることです(スタイル属性は後続の段落に使用されることに注意してください)。

textPane1.setText("<p style=\"margin-top: 0\">Try entering some newline characters</p>");

または、プレーン テキストを渡した後、EndOfLineStringProperty を置き換えます (これはハックのようなものなので、お勧めしません)。

textPane1.getDocument().putProperty(DefaultEditorKit.EndOfLineStringProperty, "<br/>\n")
于 2009-11-05T16:32:55.690 に答える
0

HTMLWriterクラスは新しい行を食べ、それを読み取ったり、HTMLに変換したりしないようです(HTMLWriterの483行を参照)。'\ n'をチェックするようにハードコーディングされているように見えるため、これを回避する簡単な方法はわかりません。JTextPaneのドキュメントのDefaultEditorKit.EndOfLineStringPropertyプロパティを(getDocument()。putPropertyを介して)<br>に設定してから、setTextをオーバーライドして「\n」を<br>に置き換えることができる場合があります。それはあなたが提案したことを行い、html、head、bodyタグの間にブレークを追加するので、bodyタグでのみ置換を行うことをお勧めします。これを行うための非常に簡単な方法があるようには見えません。

于 2009-10-07T02:04:20.323 に答える
0

これで半日悩みました。これは Java 7 でも壊れています。問題は、ユーザーが入力した新しい行を JEditorPane (HTML コンテンツ タイプの場合) に保持することです。ユーザーが入力した「\ n」にマーカーキー「\ r」を追加した場合にのみ、HTMLで新しい行を保持できました(エディターで新しい行を表示するには「\ n」が必要です)。コンテンツ全体を引き出して、別の JEditorPane または任意の HTML に配置したときの「\n<br/>」。これは Windows でのみテストしました。

((AbstractDocument) jEditorPane.getDocument()).setDocumentFilter(new HtmlLineBreakDocumentFilter());

// appears to only affect user keystrokes - not getText() and setText() as claimed
public class HtmlLineBreakDocumentFilter extends DocumentFilter
{
    public void insertString(DocumentFilter.FilterBypass fb, int offs, String str, AttributeSet a)
                        throws BadLocationException
    {
        super.insertString(fb, offs, str.replaceAll("\n", "\n\r"), a); // works
    }

    public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a)
        throws BadLocationException
    {
        super.replace(fb, offs, length, str.replaceAll("\n", "\n\r"), a); // works
    }
}


String str = jEditorPane.getText().replaceAll("\r", "<br/>"); // works
jEditorPane2.setText(str);
于 2012-03-04T06:59:09.413 に答える