Gwt 如何根据内部内容动态调整richtextbox的高度?

Gwt 如何根据内部内容动态调整richtextbox的高度?,gwt,iframe,richtextbox,jsni,Gwt,Iframe,Richtextbox,Jsni,RichTextBox基于iframe,我尝试使用JSNI。对于上述代码,“console.log(f.tagName)”将打印“iframe”,但“console.log(f.document.body.scrollHeight+'px');”将导致编译错误: com.google.gwt.core.client.JavaScriptException:(TypeError):f.document未定义“, 有人能告诉我原因吗?Blow是一个有效的版本 public class AutoRes

RichTextBox基于iframe,我尝试使用JSNI。对于上述代码,“console.log(f.tagName)”将打印“iframe”,但“console.log(f.document.body.scrollHeight+'px');”将导致编译错误:
com.google.gwt.core.client.JavaScriptException:(TypeError):f.document未定义“, 有人能告诉我原因吗?

Blow是一个有效的版本

public class AutoResizeBox extends RichTextArea
{
    public AutoResizeBox()
    {
       set(getElement());
    }

   public static native void set(Element f) /*-{
       console.log(f.tagName) ;
         // console.log(f.document.body.scrollHeight + 'px');
   }-*/;
}
import com.google.gwt.dom.client.BodyElement;
导入com.google.gwt.event.dom.client.BlurEvent;
导入com.google.gwt.event.dom.client.BlurHandler;
导入com.google.gwt.event.dom.client.ClickEvent;
导入com.google.gwt.event.dom.client.ClickHandler;
导入com.google.gwt.user.client.DOM;
导入com.google.gwt.user.client.Event;
导入com.google.gwt.user.client.ui.RichTextArea;
导入com.google.inject.inject;
公共类AutoResizeTextArea扩展RichTextArea实现ClickHandler,
模糊处理程序
{
专用静态最终整型余量=6;
私人主体要素主体;
私有字符串默认文本;
私人身高=25;
私有字符串标题;
@注入
公共自动ResizeTextArea()
{
(这个);
addClickHandler(这个);
设置高度(最小高度+像素);
setStyleName(“textArea”);
sinkEvents(Event.ONKEYUP | Event.ONKEYPRESS);
}
私人空间高度()
{
//NP移除打击将导致自动增长不起作用
if(body!=null)
{
int offsetHeight=body.getOffsetHeight();
if(offsetHeight!=body.getClientHeight())
{
int height=(离地高度<最小高度?最小高度:离地高度);
布尔破缺=高度>最小高度;
如果(断开)
{
高度=高度+裕度*2;
}
设置高度(高度+像素);
}
}
}
公共空间清洁()
{
setText(defaultText);
设置高度(最小高度+像素);
setBodyStyle(真);
}
@凌驾
公共字符串getHTML()
{
//AP RichTextArea.getHTML将返回“
”,即使不存在html //在其中,向gwt团队报告该问题; 字符串html=super.getHTML(); 返回html.equals(“
”)| | html.equals(defaultText)?“”:html; } @凌驾 公共字符串getText() { String text=super.getText(); 返回文本。等于(默认文本)?“”:文本; } @凌驾 公共无效onBlur(BlurEvent事件) { if(defaultText!=null&“.equals(getText())) { setDefaultText(defaultText); setBodyStyle(真); } } @凌驾 公共无效onBrowserEvent(事件) { 超级浏览器事件(事件); int eventType=DOM.eventGetType(事件); if(eventType==Event.ONKEYUP | | eventType==Event.ONKEYPRESS) { 调整高度(); } } @凌驾 公共作废一次点击(点击事件) { super.setText(null); setBodyStyle(假); } 专用本机void注册表项(BodyElement)/*-{ var=这个; console.log(“registerocut”); element.oncut=$entry(函数(事件){ 那个。@com.athena.client.ui.richtextbox.AutoResizeTextArea::adjustHeight(); 返回false; }); element.onpaste=$entry(函数(事件){ 那个。@com.athena.client.ui.richtextbox.AutoResizeTextArea::adjustHeight(); 返回false; }); }-*/; 私有void setBodyStyle(布尔useDefaultTextStyle) { if(body!=null) { setAttribute(“样式”, (使用DefaultTextStyle?“颜色:灰色;字体样式:斜体;”:“”) +“换行:断开单词;溢出:隐藏;边距:” +边际 +“px;填充:0;字体大小:13px;字体系列:arial、\“Microsoft YaHei\”、Verdana、Tahoma、arial、Streiti、sans serif、Simsun;”; } } 公共void setDefaultText(字符串defaultText) { super.setText(this.defaultText=defaultText); } @凌驾 公共void setHTML(字符串html) { setHTML(html); 如果(html==null | |“”.equals(html)) { setDefaultText(defaultText); } 调整高度(); } 公共空间设置最小高度(整数最小高度) { 设置高度((this.minHeight=minHeight)+“px”); } @凌驾 公共void setText(字符串文本) { super.setText(文本); 如果(text==null | |“”.equals(text)) { setDefaultText(defaultText); } } @凌驾 公共无效集合标题(字符串标题) { this.title=标题; } }
import com.google.gwt.dom.client.BodyElement;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.RichTextArea;
import com.google.inject.Inject;

public class AutoResizeTextArea extends RichTextArea implements ClickHandler,
     BlurHandler
{
private static final int margin = 6;
private BodyElement body;
private String defaultText;
private int minHeight = 25;
private String title;

@Inject
public AutoResizeTextArea()
{
    addBlurHandler(this);
    addClickHandler(this);
    setHeight(minHeight + "px");
    setStyleName("textArea");
    sinkEvents(Event.ONKEYUP | Event.ONKEYPRESS);
}

private void adjustHeight()
{
    // NP remove blow will cause auto-grow doesn't work
    if (body != null)
    {
        int offsetHeight = body.getOffsetHeight();
        if (offsetHeight != body.getClientHeight())
        {
            int height = (offsetHeight < minHeight ? minHeight : offsetHeight);
            boolean breaking = height > minHeight;
            if (breaking)
            {
                height = height + margin * 2;
            }
            setHeight(height + "px");
        }
    }
}

public void clean()
{
    setText(defaultText);
    setHeight(minHeight + "px");
    setBodyStyle(true);
}

@Override
public String getHTML()
{
    // AP RichTextArea.getHTML will return "<br>",even no html exists
    // within it,report this issue to gwt team;
    String html = super.getHTML();
    return html.equals("<br>") || html.equals(defaultText) ? "" : html;
}

@Override
public String getText()
{
    String text = super.getText();
    return text.equals(defaultText) ? "" : text;
}

@Override
public void onBlur(BlurEvent event)
{
    if (defaultText != null && "".equals(getText()))
    {
        setDefaultText(defaultText);
        setBodyStyle(true);
    }
}

@Override
public void onBrowserEvent(Event event)
{
    super.onBrowserEvent(event);
    int eventType = DOM.eventGetType(event);
    if (eventType == Event.ONKEYUP || eventType == Event.ONKEYPRESS)
    {
        adjustHeight();
    }
}

@Override
public void onClick(ClickEvent event)
{

    super.setText(null);
    setBodyStyle(false);
}

private native void registerOnCut(BodyElement element) /*-{
    var that = this;
    console.log("registerOnCut");
    element.oncut = $entry(function(event) {
        that.@com.athena.client.ui.richtextbox.AutoResizeTextArea::adjustHeight()();
        return false;
    });
    element.onpaste = $entry(function(event) {
        that.@com.athena.client.ui.richtextbox.AutoResizeTextArea::adjustHeight()();
        return false;
    });
}-*/;

private void setBodyStyle(boolean useDefaultTextStyle)
{
    if (body != null)
    {
        body.setAttribute(  "style",
                            (useDefaultTextStyle ? "color: gray;font-style: italic;" : "")
                                    + "word-wrap:break-word;overflow:hidden;margin: "
                                    + margin
                                    + "px;padding: 0;font-size: 13px;font-family: arial,\"Microsoft YaHei\", Verdana, Tahoma, Arial, STHeiTi,sans-serif, Simsun;");
    }
}

public void setDefaultText(String defaultText)
{
    super.setText(this.defaultText = defaultText);
}


@Override
public void setHTML(String html)
{
    super.setHTML(html);
    if (html == null || "".equals(html))
    {
        setDefaultText(defaultText);
    }
    adjustHeight();
}


public void setMinHeight(int minHeight)
{
    setHeight((this.minHeight = minHeight) + "px");
}

@Override
public void setText(String text)
{
    super.setText(text);
    if (text == null || "".equals(text))
    {
        setDefaultText(defaultText);
    }
}

@Override
public void setTitle(String title)
{
    this.title = title;
}
}