Java 有按钮和文本的GWT小部件?

Java 有按钮和文本的GWT小部件?,java,css,button,gwt,label,Java,Css,Button,Gwt,Label,我想创建一个GWT小部件,它有一个矩形div元素(看起来像一个按钮)以及右边的一些文本。我希望能够选择这个小部件,这样当我单击div/按钮或文本时,整个小部件都被选中 有什么关于实施的建议吗?如果有一种简单的方法可以将多个项目(如按钮和标签)嵌套在GWT按钮中,那么这可能会起作用。我正在考虑创建一个扩展Composite并包含按钮和标签的类,但我不确定在选择整个新小部件时如何同时选择这两个类。您知道如何用纯HTML绘制您要制作的内容吗 如果是这样,您只需将小部件子类化,并创建所需的元素,以及特定

我想创建一个GWT小部件,它有一个矩形div元素(看起来像一个按钮)以及右边的一些文本。我希望能够选择这个小部件,这样当我单击div/按钮或文本时,整个小部件都被选中


有什么关于实施的建议吗?如果有一种简单的方法可以将多个项目(如按钮和标签)嵌套在GWT按钮中,那么这可能会起作用。我正在考虑创建一个扩展Composite并包含按钮和标签的类,但我不确定在选择整个新小部件时如何同时选择这两个类。

您知道如何用纯HTML绘制您要制作的内容吗

如果是这样,您只需将
小部件子类化
,并创建所需的元素,以及特定的样式-无需构建多个其他小部件。然后,只需在您的新小部件上添加一个单击处理程序,您就会知道何时有人单击小部件中的任何内容


同样,如果您使用
HTMLPanel
(如您所说,包装在
组合中)或包含
标签和
按钮的东西,您可以向面板添加一个单击处理程序,并且您可以知道其他任何一个小部件何时被单击,因为单击事件将“冒泡”-如果没有任何东西阻止它,它将继续激发每个元素,然后激发其父元素,以便所有人都知道单击。然而,嵌套小部件会使您的新小部件的创建成本比简单地创建HTML要高一些,因此请确保这是您更愿意做的


在这两种情况下,您都将使用
Widget.addDomHandler(…)
实际添加单击处理程序。为了简化操作,您可以创建一个新方法,实现
HasClickHandlers
,并如下声明新方法:

@Override
public HandlerRegistration addClickHandler(ClickHandler handler) {
  return addDomHandler(handler, ClickEvent.getType());
}

根据要求,提供了一个非常简短(注释多于代码)的示例小部件,该小部件似乎完成了以下描述:

public class ButtonWithText extends Widget implements HasClickHandlers {
  public ButtonWithText(String text, String buttonLabel) {
    // Start with a <div></div> wrapper
    setElement(Document.get().createDivElement());
    // Insert a <span> for the text, allowing us to change the text later
    Element textElement = Document.get().createSpanElement();
    textElement.setInnerText(text);

    // Create a button element as well
    Element buttonElement = Document.get().createButtonElement();
    buttonElement.setInnerText(buttonLabel);

    // Attach both to the div we already created
    getElement().appendChild(textElement);
    getElement().appendChild(buttonElement);

    // Note that we could have done all of the above with SafeHtmlTemplate
    // to let us write a string, or could do the escaping ourselves and just
    // make a simple HTML string in code. I find making DOM elements like
    // this easier to read, but many people prefer the template approach.
    // When considering a template tool, also look into the new library
    // Elemento to see what it offers.
  }

  @Override
  public HandlerRegistration addClickHandler(ClickHandler handler) {
    return addDomHandler(handler, ClickEvent.getType());
  }

}
带有文本扩展的公共类按钮小部件实现了HasClickHandler{
带文本的公共按钮(字符串文本、字符串按钮标签){
//从包装开始
setElement(Document.get().createDivElement());
//为文本插入一个,允许我们稍后更改文本
元素textElement=Document.get().createSpanElement();
textElement.setInnerText(文本);
//同时创建一个按钮元素
Element buttonElement=Document.get().createButtonElement();
buttonElement.setInnerText(buttonLabel);
//将两者都附加到我们已经创建的div
getElement().appendChild(textElement);
getElement().appendChild(buttonElement);
//请注意,我们可以使用SafeThmlTemplate完成上述所有操作
//让我们写一个字符串,或者我们可以自己逃逸
//在代码中生成一个简单的HTML字符串
//这更容易阅读,但许多人更喜欢模板方法。
//在考虑使用模板工具时,还要考虑新的库
//Elemento想看看它提供了什么。
}
@凌驾
公共句柄注册addClickHandler(ClickHandler处理程序){
返回addDomHandler(handler,ClickEvent.getType());
}
}

这是正在运行的项目,供您查看-您可以单击文本或按钮,弹出窗口将按预期显示。

谢谢您的评论!我理解你关于单击处理程序的意思,但如果我知道HTML可以实现它,我仍然不确定如何实现它。如果我知道创建对象的HTML,有没有一种方法(除了使用多个小部件)不涉及使用ui.xml文件?是的!我将添加到答案中,制作一个非常丑陋的小部件,展示如何在没有uibinder的情况下实现这一点。