- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须向 GWT 中实现的一小部分 AJAX 功能添加一个表单。在 HTML 术语中,我想
<label for="personName">Name:</label><input type="text" size="50" id="personName"/>
HTML label = new HTML();
label.setHTML("<label for='"+input.getElement().getId()+"'>"+labelText+"</label>");
最佳答案
应大众需求,我向您展示 InputLabel,一个 <label>
+ <input type="text">
小工具:)
这是基于 CheckBox类(包装 <input type="checkbox">
元素) - 它 没有 已经过彻底测试 - 我把它留给读者;)
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.InputElement;
import com.google.gwt.dom.client.LabelElement;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.HasChangeHandlers;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.EventListener;
import com.google.gwt.user.client.ui.ButtonBase;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.HasName;
import com.google.gwt.user.client.ui.HasValue;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.UIObject;
import com.google.gwt.user.client.ui.Widget;
public class InputLabel extends ButtonBase implements HasName, HasValue<String>, HasChangeHandlers {
InputElement inputElem;
LabelElement labelElem;
private boolean valueChangeHandlerInitialized;
/**
* Creates an input box with no label.
*/
public InputLabel() {
this(DOM.createInputText());
//setStyleName("gwt-CheckBox"); //TODO: add a valid style name
}
/**
* Creates an input box with the specified text label.
*
* @param label the check box's label
*/
public InputLabel(String label) {
this();
setText(label);
}
/**
* Creates an input box with the specified text label.
*
* @param label the input box's label
* @param asHTML <code>true</code> to treat the specified label as html
*/
public InputLabel(String label, boolean asHTML) {
this();
if (asHTML) {
setHTML(label);
} else {
setText(label);
}
}
protected InputLabel(Element elem) {
super(DOM.createSpan());
inputElem = InputElement.as(elem);
labelElem = Document.get().createLabelElement();
getElement().appendChild(labelElem);
getElement().appendChild(inputElem);
String uid = DOM.createUniqueId();
inputElem.setPropertyString("id", uid);
labelElem.setHtmlFor(uid);
// Accessibility: setting tab index to be 0 by default, ensuring element
// appears in tab sequence. FocusWidget's setElement method already
// calls setTabIndex, which is overridden below. However, at the time
// that this call is made, inputElem has not been created. So, we have
// to call setTabIndex again, once inputElem has been created.
setTabIndex(0);
}
public HandlerRegistration addValueChangeHandler(
ValueChangeHandler<String> handler) {
// Is this the first value change handler? If so, time to add handlers
if (!valueChangeHandlerInitialized) {
addChangeHandler(new ChangeHandler() {
public void onChange(ChangeEvent event) {
ValueChangeEvent.fire(InputLabel.this, getValue());
}
});
valueChangeHandlerInitialized = true;
}
return addHandler(handler, ValueChangeEvent.getType());
}
/**
* Returns the value property of the input element that backs this widget.
* This is the value that will be associated with the InputLabel name and
* submitted to the server if a {@link FormPanel} that holds it is submitted.
* <p>
* This will probably return the same thing as {@link #getValue}, left here for magic reasons.
*/
public String getFormValue() {
return inputElem.getValue();
}
@Override
public String getHTML() {
return labelElem.getInnerHTML();
}
public String getName() {
return inputElem.getName();
}
@Override
public int getTabIndex() {
return inputElem.getTabIndex();
}
@Override
public String getText() {
return labelElem.getInnerText();
}
/**
* Gets the text value of the input element.
* <p>
* @return the value of the input box.
* Will not return null
*/
public String getValue() {
if (isAttached()) {
return inputElem.getValue();
} else {
return inputElem.getDefaultValue();
}
}
@Override
public boolean isEnabled() {
return !inputElem.isDisabled();
}
@Override
public void setAccessKey(char key) {
inputElem.setAccessKey("" + key);
}
@Override
public void setEnabled(boolean enabled) {
inputElem.setDisabled(!enabled);
if (enabled) {
removeStyleDependentName("disabled");
} else {
addStyleDependentName("disabled");
}
}
@Override
public void setFocus(boolean focused) {
if (focused) {
inputElem.focus();
} else {
inputElem.blur();
}
}
/**
* Set the value property on the input element that backs this widget. This is
* the value that will be associated with the InputLabel's name and submitted to
* the server if a {@link FormPanel} that holds it is submitted.
* <p>
* Don't confuse this with {@link #setValue}.
*
* @param value
*/
public void setFormValue(String value) {
inputElem.setAttribute("value", value);
}
@Override
public void setHTML(String html) {
labelElem.setInnerHTML(html);
}
public void setName(String name) {
inputElem.setName(name);
}
@Override
public void setTabIndex(int index) {
// Need to guard against call to setTabIndex before inputElem is
// initialized. This happens because FocusWidget's (a superclass of
// InputLabel) setElement method calls setTabIndex before inputElem is
// initialized. See InputLabel's protected constructor for more information.
if (inputElem != null) {
inputElem.setTabIndex(index);
}
}
@Override
public void setText(String text) {
labelElem.setInnerText(text);
}
/**
* Sets the text in the input box.
* <p>
* Note that this <em>does not</em> set the value property of the
* input element wrapped by this widget. For access to that property, see
* {@link #setFormValue(String)}
*
* @param value the text to set; must not be null
* @throws IllegalArgumentException if value is null
*/
public void setValue(String value) {
setValue(value, false);
}
/**
* Sets the text in the input box, firing {@link ValueChangeEvent} if
* appropriate.
* <p>
* Note that this <em>does not</em> set the value property of the
* input element wrapped by this widget. For access to that property, see
* {@link #setFormValue(String)}
*
* @param value true the text to set; must not be null
* @param fireEvents If true, and value has changed, fire a
* {@link ValueChangeEvent}
* @throws IllegalArgumentException if value is null
*/
public void setValue(String value, boolean fireEvents) {
if (value == null) {
throw new IllegalArgumentException("value must not be null");
}
String oldValue = getValue();
inputElem.setValue(value);
inputElem.setDefaultValue(value);
if (value.equals(oldValue)) {
return;
}
if (fireEvents) {
ValueChangeEvent.fire(this, value);
}
}
// Unlike other widgets the InputLabel sinks on its inputElement, not
// its wrapper
@Override
public void sinkEvents(int eventBitsToAdd) {
if (isOrWasAttached()) {
Event.sinkEvents(inputElem,
eventBitsToAdd | Event.getEventsSunk(inputElem));
} else {
super.sinkEvents(eventBitsToAdd);
}
}
/**
* <b>Affected Elements:</b>
* <ul>
* <li>-label = label next to the input box.</li>
* </ul>
*
* @see UIObject#onEnsureDebugId(String)
*/
@Override
protected void onEnsureDebugId(String baseID) {
super.onEnsureDebugId(baseID);
ensureDebugId(labelElem, baseID, "label");
ensureDebugId(inputElem, baseID, "input");
labelElem.setHtmlFor(inputElem.getId());
}
/**
* This method is called when a widget is attached to the browser's document.
* onAttach needs special handling for the InputLabel case. Must still call
* {@link Widget#onAttach()} to preserve the <code>onAttach</code> contract.
*/
@Override
protected void onLoad() {
setEventListener(inputElem, this);
}
/**
* This method is called when a widget is detached from the browser's
* document. Overridden because of IE bug that throws away checked state and
* in order to clear the event listener off of the <code>inputElem</code>.
*/
@Override
protected void onUnload() {
// Clear out the inputElem's event listener (breaking the circular
// reference between it and the widget).
setEventListener(asOld(inputElem), null);
setValue(getValue());
}
/**
* Replace the current input element with a new one. Preserves
* all state except for the name property, for nasty reasons
* related to radio button grouping. (See implementation of
* {@link RadioButton#setName}.)
*
* @param elem the new input element
*/
protected void replaceInputElement(Element elem) {
InputElement newInputElem = InputElement.as(elem);
// Collect information we need to set
int tabIndex = getTabIndex();
String checked = getValue();
boolean enabled = isEnabled();
String formValue = getFormValue();
String uid = inputElem.getId();
String accessKey = inputElem.getAccessKey();
int sunkEvents = Event.getEventsSunk(inputElem);
// Clear out the old input element
setEventListener(asOld(inputElem), null);
getElement().replaceChild(newInputElem, inputElem);
// Sink events on the new element
Event.sinkEvents(elem, Event.getEventsSunk(inputElem));
Event.sinkEvents(inputElem, 0);
inputElem = newInputElem;
// Setup the new element
Event.sinkEvents(inputElem, sunkEvents);
inputElem.setId(uid);
if (!accessKey.equals("")) {
inputElem.setAccessKey(accessKey);
}
setTabIndex(tabIndex);
setValue(checked);
setEnabled(enabled);
setFormValue(formValue);
// Set the event listener
if (isAttached()) {
setEventListener(asOld(inputElem), this);
}
}
private Element asOld(com.google.gwt.dom.client.Element elem) {
Element oldSchool = elem.cast();
return oldSchool;
}
private void setEventListener(com.google.gwt.dom.client.Element e,
EventListener listener) {
DOM.setEventListener(asOld(e), listener);
}
@Override
public HandlerRegistration addChangeHandler(ChangeHandler handler) {
return addDomHandler(handler, ChangeEvent.getType());
}
}
<label>
带有
DOM.createLabel()
的元素:
LabelElement label = DOM.createLabel().cast();
label.setHtmlFor("inputId");
Image
内联,它将被包裹在一个表中,iirc - 因为通过
display:inline
将其设置为内联将不适用于所有浏览器:咳嗽:IE:咳嗽:)。
Widgets
(或通过
Composite
创建自己的) - 你会受益更多。
target
将设置为 iframe - 多亏了这一点,页面不必重新加载 - 这会违背 AJAX 的目的 :)):
final FormPanel form = new FormPanel();
form.setAction("page.php");
TextBox box = new TextBox();
box.setName("name");
box.setText("fasdf");
Button button = new Button("Send", new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
form.submit();
}
});
form.add(box);
form.add(button);
box.setName("name");
行 - 这是您设置将用于该值的名称
TextBox
当您提交此表格时。那么,Widgets 做了什么
FormPanel
支持?那些实现
com.google.gwt.user.client.ui.HasName
界面:
XmlHttpRequest
隐藏在引擎盖之下 - AJAX 的母亲/父亲 ;)
关于GWT 有 <label> 小部件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1533899/
我想知道 GWT、GWT-RPC、EXT-GWT 和 Smart GWT 之间的区别。目前,我设法借了有关 GWT 的书籍,据我所知,它只是一个旨在促进快速高效的 Ajax(异步 JavaScript
不,这不是问如何让 Guava 在 GWT 中工作,因为我已经让它工作了。 我的问题是,当我执行继承时 我希望在命名空间 com.google.common.collect 中找到一个文件 Coll
Ext GWT 和 GWT-Ext 之间有区别吗?因为我在浏览 Ext GWT 时看到了这个页面 http://gwt-ext.com/demo/ .有什么帮助吗? 最佳答案 ExtGWT 由开发 E
调查gwt-dispatch之后和 Google Wave I/O presentation (Best practices) ( video here ),我想知道为什么官方 GWT 版本 (2.0
我在我的应用程序中使用带有 ext 的 GWT 2.0.3。该项目不再处于积极开发状态并且已被 Smart GWT 取代。我正在为此应用程序使用 HMVC 模式。现在使用现有的 GWT 2.0.3 和
当我尝试在 Windows Vista 上为 ie 8 使用 GWT 开发模式插件时,我不断看到安装插件的提示。 运行插件后我仍然总是看到这个页面。有谁知道如何解决这样的问题? 最佳答案 看这个:Ca
我正在尝试对 GWT RPC 序列化策略进行一些背景阅读,发现 GWT 在编译后将 *.gwt.rpc 文件中的可序列化类型列入白名单。 以下是我的应用程序中生成的一个此类 .gwt.rpc 文件的摘
如果 Enum 实现了 java.io.Serializable,我无法将它序列化为 GWT。它会成功编译 GWT,但在运行时,我会感到害怕: Type 'com....security..Admin
是否有可以与 GWT 一起使用的进度条小部件,还是必须自己制作?我尝试在 google-web-toolkit-incubator、gwtupload 和 upload4gwt 中使用进度条,但没有任
由于 Javadoc 没有说明使用 com.google.gwt.core.shared.GWT 的原因,它似乎包含 com.google.gwt.core.client.GWT 的功能子集,前者存在
我必须在 gwt 中创建一个图像按钮,它使用三个图像(左侧图像、中心拉伸(stretch)图像和右侧图像)。左侧图像和右侧图像具有圆角。中心图像想要拉伸(stretch)取决于按钮标题大小.创建的 I
我正在尝试在 GWT 的垂直面板中设置 align 属性,如下所示: vpanel = new VerticalPanel(); vPanel.setHorizontalAlignment(HasHo
我想在 GWT 中添加可编辑的组合框,请告诉我解决方案? 最佳答案 试试 Advanced GWT Components , 具体来说 org.gwt.advanced.client.ui.widge
我在使用 GWT Designer 配置 GXT 时遇到问题。我拥有 Eclipse、GWT 插件和 GXT 的所有新版本,但无法将 GXT 配置为与 GWT Designer 一起使用。我设置了我的
我们有一个当前使用 Capistrano 部署的应用程序。该应用程序使用 php 作为后端,使用 GWT 作为前端。 我已经设法通过 Ant 文件编译 GWT,但想用自定义 Capistrano 任务
这应该很简单,但不知何故我找不到在 GWT 中创建简单超链接的方法。基本上,我想在用户点击某些东西时加载另一个页面。 Hyperlink似乎仅指向内部 GWT 应用程序状态。我想我可以把链接放在 HT
在 GWT 界面中哪个更好,使用带有 javacode 的普通 MVP,还是 UiBinder?从性能、编辑、简单性方面。 最佳答案 这就是Google says : Besides being a
GWT 2.5.0 开发模式 我在下面对文件上传做了一个简单的测试, startupUrl: http://127.0.0.1:8888/UploadTest.html?gwt.codesvr=127
我需要创建一个SuggestBox,在按下时将显示所有选项 Enter键。 我已经写了以下实现,看来是 工作正常。 我希望有人审查我的实现情况,并让我知道 在任何特定情况下都会引起问题。 另外,要传递
在哪里可以找到有关 GWT 和 GWT-Ext 延迟加载的更多信息? 最佳答案 快速谷歌搜索显示 nice blog entry由 GWT 团队提供。 关于 GWT-Ext,我无话可说,但无论采用何种
我是一名优秀的程序员,十分优秀!