gpt4 book ai didi

java - 从 JTextPane 获取 html - 缺少内容文本

转载 作者:行者123 更新时间:2023-11-30 04:12:38 26 4
gpt4 key购买 nike

我正在尝试从我的 JTextPane 获取 html 格式的内容。

问题是,当我插入具有指定 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>

如您所见,缺少文本“这是我的蓝色粗体文本”,但它将在框架中正确显示。

我还尝试将 jtp.getText() 直接写入文件并获得相同的结果。

最佳答案

当我测试你的代码时,我注意到一些奇怪的事情。如果仔细观察 JTextPane 上的最后一个字符串(这是我的蓝色粗体文本),尽管它以粗体显示,但它的字体与前面的文本并不完全相同。

Bold without fix

这是一个明确的迹象,表明某些属性已经丢失。另请注意,插入该字符串(上面发布的字符串)后生成的 HTML 缺少 </p>标签:在字体标签之后立即打开一个新段落。再次,有些东西在路上丢失了。

那么,这是怎么回事?好吧,当您将属性传递给 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();

}

bold with fix

看到字体的区别了吗?至于getInputAttributes()coppyAttributes()在代码中,它给出了将在任何后续插入中使用的当前属性集。这正是我们所需要的。

您可能想知道如果尚未插入文本,可能存在哪些属性。简而言之,文本中的每个元素(即文本)将由一个名为 content 的特殊内部“标签”来标识。 。该标签存储为属性。而正是这种属性的丧失才造成了严重的破坏。

希望这有帮助!

关于java - 从 JTextPane 获取 html - 缺少内容文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19262331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com