0

コンテンツが外出先で動的に追加される TextPane を実装する必要があります。テキストとリンクを含めることができます。

リンクは、textPane に JLabel を追加することで表示できます。しかし、問題は、textPane に含まれるすべてのテキストをファイルに保存する必要があることです。textPane.getText()テキストを返しますが、textPane に追加されたコンポーネントのテキストは追加しません。たとえば、textPane に String("Hello") と JLabel("label") があるとします。textPane.getText()「こんにちは」のみを返します。「ラベル」を取得するにはどうすればよいですか??

4

2 に答える 2

1

通常getText()、Document のコンテンツを表します。目標のElementsために、キャラクターを反復処理し、それぞれについて属性がComponent. 次に、egJLabelにキャストしてテキストなどを取得します。

また、コンポーネントが にどのように追加されるかを確認してくださいJTextPane。コンポーネントを属性に追加し、属性とともに適切な文字列を挿入できます。

SimpleAttributeSet attrs=new SimpleAttributeSet();
StyleConstants.setComponent(...yourLabel);
documnet.insertString(offset, yourLabel.getText(), attrs);

次に、DocumentのテキストがありJLabelます。

于 2012-11-02T13:57:41.007 に答える
0

私の推測では、コンポーネント構造を再帰的にトラバースし、各ノード (存在する場合) のテキストを取得して追加するメソッドを作成します。擬似コードでは、次のようになります。

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
        }
    }
}

ご覧のとおり、それは 1 つのコンポーネント (あなたの ) から始まり、そのTextPane下の要素をトラバースします。必要に応じて、テキストの内容をバッファーに追加する前に、子コンポーネントに実際テキストがあるかどうかを確認できます。要素をトラバースした後、バッファの内容を返します。

編集

Container#getComponents()JavaDoc はそれについて何も述べていませんが、常に同じ順序で子コンポーネントを返すと思います(内部的に使用されるため) List#toArray()

于 2012-11-02T11:03:21.673 に答える