Gwt 如何根据内部内容动态调整richtextbox的高度?
RichTextBox基于iframe,我尝试使用JSNI。对于上述代码,“console.log(f.tagName)”将打印“iframe”,但“console.log(f.document.body.scrollHeight+'px');”将导致编译错误: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
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;
}
}