0

我有以下用户界面情况:

<g:DisclosurePanel width="100%" ui:field="disclosurePanel">
       <g:customHeader>
         <g:HorizontalPanel width="100%" ui:field="tableRow">
           <g:cell width="16px" horizontalAlignment="ALIGN_CENTER">
             <g:Image url="images/plus-icon.gif" ui:field="icon"></g:Image>
           </g:cell>
           <g:cell width="20%">
             <g:Label ui:field="productName"></g:Label>
           </g:cell>
           <g:cell>
             <g:Anchor ui:field="info"><ui:msg>More info...</ui:msg></g:Anchor>
           </g:cell>
         </g:HorizontalPanel>
       </g:customHeader>
       <g:VerticalPanel width="100%" ui:field="details">
         <!-- details panel here -->
       </g:VerticalPanel>
     </g:DisclosurePanel>

我想将一个事件处理程序方法绑定到Anchor info. 然而,我在标题中的每个小部件都会打开和关闭显示面板,即使我在infoby 上挂了一些东西:

@UiHandler("info")
public void onInfoClicked(ClickEvent event)
{
   // do something custom, but do not open/close the disclosurepanel
}

我希望这可以在不制作自定义复合材料或其他东西的情况下实现。你能帮助我吗?

4

2 回答 2

1

好吧,它按设计工作。您放入其中的每个元素DisclosurePanel都有一个单击处理程序,可以打开/关闭它。所以在你的标题里面应该只有图像和/或文本,基本上只有没有逻辑的元素。我会考虑以不同的方式排列您的 html 元素,因此链接不在标题内...

如果你真的,真的必须把它放在标题中,你可以将它添加到你的锚点击事件中:

disclosurePanel.setOpen(!disclosurePanel.isOpen());

这将恢复 DisclosurePanel 的先前状态。好的部分是,它太快了,你甚至看不到 DisclosurePanel 打开/关闭,不好的部分是,这真是糟糕的设计......

另外:DisclosurePanel 使用 Anchors 来显示。锚点只允许每个定义块元素,所以你根本不应该这样使用它!(请参阅将 div 放入锚点是否正确?

于 2012-04-12T09:14:02.867 回答
1

DisclosurePanel 的 header 是私有内部类 ClickableHeader:

private final class ClickableHeader extends SimplePanel {

private ClickableHeader() {
  // Anchor is used to allow keyboard access.
  super(DOM.createAnchor());
  Element elem = getElement();
  DOM.setElementProperty(elem, "href", "javascript:void(0);");
  // Avoids layout problems from having blocks in inlines.
  DOM.setStyleAttribute(elem, "display", "block");
  sinkEvents(Event.ONCLICK);
  setStyleName(STYLENAME_HEADER);
}

@Override
public void onBrowserEvent(Event event) {
  // no need to call super.
  switch (DOM.eventGetType(event)) {
    case Event.ONCLICK:
      // Prevent link default action.
      DOM.eventPreventDefault(event);
      setOpen(!isOpen);
  }
}
}

假设您的代码:

@UiField
DisclosurePanel p;

//call this somewhere once on widget creation to 
//prevent header's default click handler
private void myInit()
{
    p.getHeader().unsinkEvents(Event.ONCLICK);
}

@UiHandler("info")
public void onInfoClicked(ClickEvent event)
{
   //trigger "standard" click handler if you want
   if(someCondition) {
       //convert GwtEvent descendant to NativeEvent descendant;
       p.getHeader().onBrowserEvent(event.getNativeEvent().<Event> cast());
   }

   // do something custom, but do not open/close the disclosurepanel
}
于 2012-04-12T09:29:15.213 回答