1

からhtml形式のコンテンツを取得しようとしていJTextPaneます。

問題は、指定されたテキストを挿入するAttributeSetと、ファイルに書き出そうとしたときにコンテンツテキストが出力されず、スタイリングが出力されることです。

これがテキストの挿入方法に関係しているのか、それともファイルに書き込もうとしている方法に関係しているのかはわかりません。

次に例を示します。

import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import java.awt.BorderLayout;
import java.io.*;
import java.awt.Color;

public class SOExample extends JFrame
{
    public static void main (String[] args)
    {
        SwingUtilities.invokeLater(
            new Runnable()
            {
                @Override
                public void run()
                {
                    SOExample aFrame = new SOExample();
                    aFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    aFrame.setVisible(true);
                }
            }
        );
    }

    public SOExample()
    {
        initComponents();
        addText("This is my plain text", null);

        SimpleAttributeSet BOLD = new SimpleAttributeSet();
        StyleConstants.setBold(BOLD, true);
        StyleConstants.setForeground(BOLD, Color.BLUE);
        addText("This is my BLUE BOLD text",BOLD);

        outputHTMLfile();
    }

    private void initComponents()
    {
        this.setBounds(300,300,300,300);
        jtp = new JTextPane();
        jtp.setContentType("text/html");
        jsp = new JScrollPane();
        JPanel jp = new JPanel(new BorderLayout());
        jp.add(jtp);
        jsp.add(jp);
        jsp.setViewportView(jp);
        this.add(jsp, BorderLayout.CENTER);
    }

    private void addText(String text, SimpleAttributeSet attr)
    {
        try
        {
            HTMLDocument doc = (HTMLDocument)jtp.getDocument();
            doc.insertString(doc.getLength(), text +"\n", attr);
        }
        catch (BadLocationException blex)
        {
            blex.printStackTrace();
        }
    }

    private void outputHTMLfile()
    {
        File f = new File("C:\\Temp", "TestFile.html");
        try
        {
            BufferedOutputStream br = new BufferedOutputStream(new FileOutputStream(f));
            HTMLEditorKit kit = new HTMLEditorKit();
            kit.write(br, (HTMLDocument)jtp.getDocument(),  0, ((HTMLDocument)jtp.getDocument()).getLength() );
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }   
    }

    private JTextPane jtp;
    private JScrollPane jsp;
    }

これにより、次のようなhtmlの出力ファイルが得られます

 <html>
   <head>

   </head>
   <body>
     <p style="margin-top: 0">
       This is my plain text
     </p>
     <p style="margin-top: 0">
       <b><font color="#0000ff"><p>
 </font></b>    </p>
   </body>
 </html>

ご覧のとおり、これにはテキスト"This is my BLUE BOLD text"がありませんが、フレームには正しく表示されます。

jtp.getText()また、ファイルに直接書き込もうとしましたが、同じ結果が得られました。

4

1 に答える 1

2

コードをテストしているときに、奇妙なことに気付きました。JTextPane の最後の文字列 ( This is my BLUE BOLD text )をよく見ると、太字で示されていますが、前のテキストとまったく同じフォントではありません。

修正なしの太字

これは、いくつかの属性が失われていることを明確に示しています。その文字列を挿入した後に生成された HTML (上に投稿したもの) には</p>タグがないことにも注意してください。新しい段落が font タグの直後に開かれます。繰り返しますが、途中で何かが失われました。

それで、ここで何が起こっているのですか?属性をinsertStringメソッドに渡すと、既存の属性が上書きされます。あなたがしなければならないことは、挿入する前に、それらの属性を新しい太字と色の属性とマージすることです。実際には、コンストラクターのコードを少し変更する必要があります。

public SOExample() {
    initComponents();
    addText("This is my plain text", null);

    //Retrieve existing attributes.
    SimpleAttributeSet previousAttribs = new SimpleAttributeSet
                                             (jtp.getInputAttributes()
                                                 .copyAttributes());

    SimpleAttributeSet BOLD = new SimpleAttributeSet();
    StyleConstants.setBold (BOLD, true);
    StyleConstants.setForeground (BOLD, Color.BLUE);

    //Merge new attributes with existing ones.    
    previousAttribs.addAttributes (BOLD);

    //Insert the string and apply merged attributes.
    addText ("This is my BLUE BOLD text", previousAttribs);

    outputHTMLfile();

}

太字で修正

フォントの違いがわかりますか?getInputAttributes()については。コードでcopyAttributes()を使用すると、後続の挿入で使用される現在の属性セットが得られます。これは、私たちが必要としているものです。

テキストがまだ挿入されていない場合、どの属性が存在する可能性があるのか​​疑問に思うかもしれません。要するに、テキスト内のすべての要素、すなわちテキストは、contentと呼ばれる特別な内部「タグ」によって識別されます。このタグは属性として保存されます。そして、ここで大混乱を引き起こしたのは、この属性の喪失です。

お役に立てれば!

于 2013-11-04T17:53:40.960 に答える