我需要实现一个 TextPane,内容将在旅途中动态添加。它可以有文本和链接。
可以通过将 JLabel 添加到 textPane 来显示链接。但问题是,textPane 拥有的所有文本都需要存储到文件中。textPane.getText()
返回文本,但它不附加添加到 textPane 的组件的任何文本。例如,如果 textPane 有一个 String("Hello") 和一个 JLabel("label")。textPane.getText()
只返回“你好”。如何检索“标签”?
通常getText()
表示文档的内容。为了您的目标,您应该遍历 CharacterElements
并为每个角色检查属性是否具有Component
. 然后投射到例如JLabel
并获取文本等。
还要检查组件是如何添加到JTextPane
. 您可以将组件添加到属性中,并在属性中插入适当的字符串。
SimpleAttributeSet attrs=new SimpleAttributeSet();
StyleConstants.setComponent(...yourLabel);
documnet.insertString(offset, yourLabel.getText(), attrs);
然后你Document
有JLabel
.
我的猜测是编写一个递归遍历组件结构的方法,检索每个节点的文本(如果有的话)并附加它。在伪代码中,它看起来像这样:
public void collectText(Container root) {
StringBuilder builder = new StringBuilder();
collectText(root, builder);
return builder.toString();
}
private void collectText(Container root, StringBuilder builder) {
builder.append(root.getText());
for (Component c : root.getComponents()) {
// Check whether this component has other components
if (c instanceof Container) {
collectText((Container) c, builder);
} else {
// Check whether this Component has text content, and append it to the builder
}
}
}
如您所见,它从一个组件开始 - 这将是 your TextPane
,然后遍历下面的任何元素。或者,您可以在将其文本内容附加到缓冲区之前检查子组件是否实际具有文本。遍历元素后,它返回缓冲区的内容。
编辑
尽管Container#getComponents()
JavaDoc 没有说明它,但我认为它总是以相同的顺序返回它的子组件(因为它在List#toArray()
内部使用)。