2009-12-11 97 views
2

我试图捕捉一个事件,当我在GWT 2.0中切换StackLayoutPanel的堆栈时。
最大的问题是我不知道哪个事件被解雇,似乎没有文档,我添加了一个带有addDomHandler()的ChangeHandler,但没有奏效。
不幸的是,StackLayoutPanel没有实现getSelectedIndex()函数,所以我不能只使用ClickEvent,然后检查选定的索引是否已经改变。在GWT 2.0中切换堆栈StackLayoutPanel时触发事件

是我唯一使用StackPanel的解决方案,还是有办法让它与StackLayoutPanel一起工作吗?

回答

2

在做了一些实验后,我做了如下工作:使用Label作为标题的窗口部件,宽度为100%,然后添加一个ClickEvent处理程序。每次ClickEvent到达时,这意味着用户点击标题,所以面板将可见... 不是很好,但它的工作。 我试图用一个ClickWrapper(看看到StackLayoutPanel源代码)包住头小部件,但它没有工作,我不知道到底为什么...

+0

最后我不得不继承StackLayoutPanel,以尝试解决删除的bug;)(http://code.google.com/p/google-web-toolkit/issues/detail?id = 4174)...如果你是StackLayoutPanel的子类,你可以使用ClickWrapper类触发事件... – danigb 2010-01-10 16:39:03

1

我这样做的

公共类StackComponent扩展StackLayoutPanel实现HasChangeHandlers {

public StackComponent(Unit unit) { 
    super(unit); 
} 

@Override 
public void showWidget(Widget widget) { 
    super.showWidget(widget); 
    fireEvent(new StackChangeEvent(widget)); 

} 

@Override 
public HandlerRegistration addChangeHandler(ChangeHandler handler) { 
    return addDomHandler(handler, ChangeEvent.getType()); 
} 

}

3

相信在GWT 2.0.3 StackLayoutPanel有方法addSelectionHandler。触发的事件是SelectionEvent,event.getSelectedItem()返回相应的堆栈标题ID。

+0

更清楚的是,id是一个Integer,其中0是添加到StackLayoutPanel的第一项, 1是下一个等等。SelectionEvent现在也被输入(SelectionEvent )。这在GWT 2.5.1中非常适合我。 – Splaktar 2013-09-23 20:27:34

0

这工作我形成:

private int selectedIndex = 0; 

public Main() { 
    initWidget(ourUiBinder.createAndBindUi(this)); 

    navigatorStackPanel.add(yourWidgetOne, "Title one"); 

    navigatorStackPanel.add(yourWidgetTwo, "Title two"); 

    navigatorStackPanel.addHandler(new ClickHandler() { 
     @Override 
     public void onClick(ClickEvent event) { 
      if (navigatorStackPanel.getSelectedIndex() != selectedIndex) { 
       selectedIndex = navigatorStackPanel.getSelectedIndex(); 
       if (selectedIndex == 0) 
        do something one; 
       else 
        do something two; 
       GWT.log(" Changed"); 
      } 
     } 
    }, ClickEvent.getType()); 
}