gpt4 book ai didi

java - JTextPane 无法正确渲染 span 标签

转载 作者:行者123 更新时间:2023-11-30 03:39:20 25 4
gpt4 key购买 nike

我有一些代码:

package main;

import java.awt.EventQueue;
import java.awt.Font;
import java.io.StringWriter;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.text.DefaultCaret;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.StyleSheet;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;

public class LogConsole extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JTextPane logPane;
private HTMLDocument logDoc;
private HTMLEditorKit logKit;

/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
LogConsole test = new LogConsole();
test.setVisible(true);

test.log("<span>Hello 1</span><br/>"); //Test 1
test.log("<span>Hello 2</span><br/>"); //Test 2
test.log("<span>Hello 3</span><br/>"); //Test 3

test.log("<span>Hello </span>"); //Test 4
test.log("<span>world!</span>"); //Test 5

test.printHTML();

} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Log some data...
* @param str
*/
public void log(String s){
s = s.replaceAll("\n", "<br/>");
try {
logKit.insertHTML(logDoc, logDoc.getLength(), s, 0, 0, null);
} catch (Exception e) {
e.printStackTrace();
}
}
public void printHTML(){
try{
StringWriter writer = new StringWriter();
logKit.write(writer, logDoc, 0, logDoc.getLength());
String s = writer.toString();
System.out.println(s);
} catch (Exception ex) {
ex.printStackTrace();
}
}

public void clearLog(){
try {
logPane.setText("");

} catch (Exception e) {
e.printStackTrace();
}
}

/**
* Create the frame.
*/
public LogConsole() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);

JScrollPane scrollPane = new JScrollPane();
GroupLayout gl_contentPane = new GroupLayout(contentPane);
gl_contentPane.setHorizontalGroup(
gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup()
.addContainerGap()
.addComponent(scrollPane, GroupLayout.DEFAULT_SIZE, 404, Short.MAX_VALUE)
.addContainerGap())
);
gl_contentPane.setVerticalGroup(
gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup()
.addContainerGap()
.addComponent(scrollPane, GroupLayout.DEFAULT_SIZE, 229, Short.MAX_VALUE)
.addContainerGap())
);

logPane = new JTextPane();
logPane.setContentType("text/html");
logPane.setEditable(false);
scrollPane.setViewportView(logPane);
contentPane.setLayout(gl_contentPane);

DefaultCaret caret = (DefaultCaret)logPane.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

logDoc = (HTMLDocument) logPane.getDocument();
logKit = (HTMLEditorKit) logPane.getEditorKit();
Font font = new Font("Consolas", Font.PLAIN, 14);
String bodyRule = String.format("body{font-family:%s;font-size:%spt",
font.getFamily(), font.getSize());
StyleSheet style = logDoc.getStyleSheet();
style.addRule(bodyRule);
}
}

enter image description here
我想将应用程序中的一些数据记录到 JTextPane,但遇到一些问题。
首先,当我在两个 log() 语句上添加两个 span 标记时,它会在其之间放置一个新行(请参阅 Test4 - Test5)。
所以我认为JTextPane不支持内联标签,所有标签都是 block 标签。
这没关系,因为每行上的每个数据日志都很“好闲”,
你不需要在每个数据日志上添加“
”,但我更喜欢自己处理它

如果我在每个日志数据处插入 3 个带有“
”的 log() 语句(测试 1,2,3),
第 1 行写入“Hello 1”,然后换行,然后再换行。
第 2 行只写“Hello 2”和一个新行
第 3 行写入“Hello 3”和一个新行
但是测试1和测试2具有相同的语句形式,却产生两种不同的方式,为什么?
如果我将测试 2 更改为:

test.log("<span>Hello 2</span>"); //Test 2

这不会改变结果!
任何人都可以为我解释这些问题吗?
以及如何解决这些问题。
谢谢

最佳答案

问题不在于插入 span,而是您使用 insertHTML() 创建了一种周围的段落元素。

调用工作正常,不会创建 2 行

test.log("<span>Hello </span><span>World</span>");

试试这个

public void log(String s){
s = s.replaceAll("\n", "<br/>");
try {
// logKit.insertHTML(logDoc, logDoc.getLength(), s, 0, 0, null);
logDoc.insertAfterEnd(logDoc.getCharacterElement(logDoc.getLength()), s);
} catch (Exception e) {
e.printStackTrace();
}
}

关于java - JTextPane 无法正确渲染 span 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27146177/

25 4 0