2010-06-23 69 views
4

我正在使用的应用程序包含大量文本框的设置数据页面;每个页面都有一个保存按钮。我已经将大多数页面定义为* .ui.xml文件,并使用了GWT 2.0 UI绑定。启用和禁用GWT页面上的保存按钮

我想添加一个保存按钮,该按钮被禁用onload,并且只有在用户将数据修改为其中一个文本框后才能启用。

我知道我可以注册一个事件处理程序对页面上的每个元素来启用按钮,但我想要一个更优雅的解决方案。理想情况下,我想定义一个“监听”页面上的事件并自行更改的按钮。这是可能的GWT?

回答

4

你也可以改变事件添加到含有小部件你的整个使用addDomHandler

public class SetupDataPage extends Composite{ 

    // Binder stuff 

    // Button from the binder 
    @UiField Button saveBtn; 

    public SetupDataPage(){ 
     addDomHandler(new ChangeHandler() { 

      @Override 
      public void onChange(ChangeEvent event) { 
       saveBtn.setEnabled(true); 
      } 
     }, ChangeEvent.getType()); 
    } 
} 

谨防这将触发对SetupDataPage所有文本框的事件。另一方面,它可能不适用于某些特定的小部件。我知道它的GWT的文本框,复选框,列表框...

+0

这对我们很有效。使用domHandler加载页面时是否存在性能问题? – Tihom 2010-06-24 14:44:11

+0

@Tihom我们没有注意到任何,但没有先进的性能测试已经完成。 – Jla 2010-06-24 15:14:37

+0

这大部分工作。我们发现的例外是IE浏览器,如果页面有一个列表框。在IE中更改列表框中的值不会触发dom上的ChangeEvent。我不得不在列表框上添加一个显式的更改处理程序来使其工作 – Tihom 2010-06-28 19:35:19

1

您可以制定出一个非常简单的解决这个。

  1. 放在一个HTMLPanel所有的编辑控件(或任何其他面板,如果你愿意的话)
  2. 拥有一个UI:在附带的Java文件字段参考这个HTMLPanel。
  3. 在您的java类中调用initWidget后不久,遍历HTMLPanel的所有子部件并在每个输入部件上注册一个ChangeHandler。

伪代码:

for (int i = 0; i < hTMLPanel.getWidgetCount(); i++) 
    { 
     Widget widget = hTMLPanel.getWidget(i); 

     if (widget instanceof HasChangeHandlers) 
      ((HasChangeHandlers)widget).addChangeHandler(<Your Change Handler to enable save>); 
    } 

可以使这个递归的,如果你有嵌套小部件。

+3

我只想补充一点,你应该在进入循环之前定义'ChangeHandler',然后重用它 - 不需要创建/实例化它为每个元素。 – 2010-06-23 17:16:13

+0

更改处理程序的问题在于它们在“焦点丢失”事件上执行。所以你需要在文本框中输入一个值,然后使用TAB键或点击某处,然后你的处理程序将被执行。此外,这个“价值变化”事件将阻止“鼠标点击”。例如在文本字段中输入一个值,然后点击一些“更新”按钮。你的“更改”处理程序将被执行,但你的鼠标点击处理程序不会。 – Alex 2012-06-18 17:42:55

1

DOM处理程序是更好,会执行得更快..