0

RichTextArea フォーマッターの設定は次のとおりです。

void initUI(){//invoke in default constructor...
            getRichTextArea().getFormatter().setFontName("Verdana");
            getRichTextArea().getFormatter().setFontSize(FontSize.X_SMALL);
            getRichTextArea().getFormatter().setForeColor("gray");
}

次に、次のようなコードを試したので、RichTextArea を正しくクリアしてフォーマッタを保持する方法を考えています。

getRichTextArea().setText(null);//invoke on some button click...

...そして、実際にはすべての内部テキストが削除されましたが、テキストを再入力しようとすると、再入力されたテキストにはフォーマットされたものではなくデフォルトのフォントと色などが含まれているため、フォーマット設定全体が起動されます:(

...ちなみに、このような方法getRichTextArea().getFormatter().undo();はフォーマッタ設定も削除します:(

だから私の質問は...リッチテキスト領域をクリアしてそのフォーマットを維持する方法は?

ありがとう

PS GWT 2.3

4

2 に答える 2

1

「フォーマット」とは何かを理解する必要があります。リッチ テキストとは、複数のセクションが含まれ、各セクションに独自のスタイルと属性があることを意味します。したがって、「デフォルト」のものはありません。定義する必要があります。

実際には、リッチ テキスト領域の下にあるのは、contenteditable=true の div だけです。スタイル付きのコンテナ (別の div) に配置すると、その中のスタイルが継承されます。そうすれば、デフォルトのスタイルを定義できます。

もう 1 つの方法は、必要な属性を確認し、Formatter で直接指定することです。

これを達成する他の方法はないと思います。Formatter は execCommand の単なるラッパーであり、動作はブラウザーに依存します。いくつか分析してみましょう。

これはあなたのリッチテキストエリアです

<div contenteditable=true>hello, world!</div>

すべてのテキストを選択して を呼び出すFormatter.toggleBold()と、次のようになります。

<div contenteditable=true><b>hello, world!</b></div>

あなたがsetText('')本当にすることをすればdiv.innerText=''、あなたは得るでしょう

<div contenteditable=true></div>

フォーマットが失われました。

スタイルを維持するための回避策として、スタイルをコンテナーに入れてコンテナーにスタイルを設定するか、使用されたフォーマットを覚えておいて setText() の後に再適用する方法しかありません。

于 2013-06-10T21:37:50.903 に答える
0

カーソルを配置し、範囲を選択し、テキストを削除するには、RichTextArea でカーソル コントロールが必要なようです。

この機能は gwt RichTextArea にはありませんが、長い議論、いくつかのパッチ、およびそれを実装するライブラリ (gwt-selection)がある問題があります。gwt のメンテナーが最近活動していないすべての問題を削除しているため、問題は最近クローズされましたが、再オープンするか、所有者に ping を実行してください。このライブラリを使用すると、ドキュメントの一部を取得して、書式タグを削除せずに削除できます。

とにかく、完全なテキストを削除し、すべてのコンテンツにデフォルトの css を設定する必要がある場合は、RichTextArea iframe のボディをスタイルすることができます。

gwtqueryを使用すると、コンテンツの本文をスタイルに合わせて簡単に取得できます。

import static com.google.gwt.query.client.GQuery.*;

[...]

// First attach the widget to the DOM
RootPanel.get().add(richTextArea);

// We only can manipulate the body, once the iframe document has been created, 
// and this happens after it has been attached. 
// Because richtTextArea uses a timeout to initialize we need a delay.
$(richTextArea)
  .delay(1, 
    lazy()
      .contents().find("body")
        .css("font-name", "verdana")
        .css("font-size", "x-small")
        .css("color", "gray")
    .done());

gwtquery をインポートせずに同じことをしたい場合は、RichTextArea がアタッチされて初期化された後に body 要素を取得するための jsni が必要です。

// First attach the widget to the DOM
RootPanel.get().add(richTextArea);

// We only can manipulate the body, once the iframe document has been created, 
// and this happens after it has been attached.
// Using a timer because richtTextArea uses a timeout to initialize
new Timer() {

  // There is no method to get the body, so we use JSNI
  private native Element getBodyElement(Element iframe) /*-{
    return iframe.contentWindow.document.body;
  }-*/;

  public void run() {
    Element e = getBodyElement(richTextArea.getElement());
    e.getStyle().setProperty("fontName", "Verdana");
    e.getStyle().setProperty("fontSize", "x-small");
    e.getStyle().setProperty("color", "gray");
  }
}.schedule(1);
于 2013-06-11T06:30:28.620 に答える