Java JTextPane#getText()不返回组件的文本
我需要实现一个文本窗格,其中的内容将在移动中动态添加。它可以有文本和链接 可以通过将JLabel添加到文本窗格来显示链接。但问题是,textPane的所有文本都需要存储到一个文件中Java JTextPane#getText()不返回组件的文本,java,swing,Java,Swing,我需要实现一个文本窗格,其中的内容将在移动中动态添加。它可以有文本和链接 可以通过将JLabel添加到文本窗格来显示链接。但问题是,textPane的所有文本都需要存储到一个文件中textPane.getText()返回文本,但不会将添加到textPane的组件的任何文本追加到文本窗格中。 例如,如果textPane有一个字符串(“Hello”)和一个JLabel(“label”)textPane.getText()只返回“hello”。如何检索“label”?我的猜测是编写一个递归遍历组件结构
textPane.getText()
返回文本,但不会将添加到textPane的组件的任何文本追加到文本窗格中。
例如,如果textPane有一个字符串(“Hello”)和一个JLabel(“label”)
textPane.getText()
只返回“hello”。如何检索“label”?我的猜测是编写一个递归遍历组件结构的方法,检索每个节点(如果有)的文本并附加它。在伪代码中,它看起来像这样:
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
}
}
}
如您所见,它从一个组件开始,即TextPane
,然后遍历下面的任何元素。或者,在将子组件的文本内容附加到缓冲区之前,可以检查子组件是否实际包含文本。遍历元素后,它返回缓冲区的内容
编辑
尽管JavaDoc没有对它做任何说明,但我假设它总是以相同的顺序返回它的子组件(因为它在内部使用List\toArray()
。通常getText()
表示文档的内容。对于您的目标,您应该迭代字符元素
,并为每个元素检查属性是否包含组件
。然后强制转换到例如JLabel
并获取文本等
还要检查如何将组件添加到JTextPane
。您可以将组件添加到属性中,并使用属性插入适当的字符串
SimpleAttributeSet attrs=new SimpleAttributeSet();
StyleConstants.setComponent(...yourLabel);
documnet.insertString(offset, yourLabel.getText(), attrs);
然后,您的
文档
包含JLabel
的文本。虽然JTextPane
是一个容器
,但它并不意味着要向imo添加组件
。如果您想显示链接,为什么不选择支持HTML并在HTML中创建链接的JTextComponent
。谢谢。但我不能,因为我在文本窗格中添加了一个功能。向后兼容性html的另一个问题是,内容是动态添加的。我将不得不不断修改html页面,在这里文本窗格有组件。而且文本的顺序需要保持。如何维持订单,谢谢。这正是我添加标签的方式。另一个问题是,;我想从文件(包括JLabels)重新加载textPane。我通过在JLabel中添加的文本周围加上引号来实现这一点。他们的方法能更好吗?序列化??我会添加一个带有一些值的人工属性,例如“MyMarker”。当需要通过文档的getCharacterElement()方法重新加载scn所有字符元素时。然后检查标记值并相应地更新文本。