2011-09-23 36 views
1

我有一个2列的表格:复选框和文本框。我想根据相应的(同一行)复选框状态禁用文本字段。如果复选框被选中,那么文本字段将被清除并且是只读的。这可能吗 ?这里是我的代码:如何使用Vaadin表格组件启用/禁用单元格?

@SuppressWarnings("serial") 
private Table filtersTable() { 
    final Table table = new Table(); 
    table.setPageLength(10); 
    table.setSelectable(false); 
    table.setImmediate(true); 
    table.setSizeFull(); 
    // table.setMultiSelectMode(MultiSelectMode.SIMPLE) ; 
    table.addContainerProperty("Tipo filtro", CheckBox.class, null); 
    table.addContainerProperty("Valor", String.class, null); 
    table.setEditable(true); 
    for (int i = 0; i < 15; i++) { 
     TextField t = new TextField(); 
     t.setData(i); 
     t.setMaxLength(50); 
     t.setValue("valor " + i); 
     t.setImmediate(true); 
     t.setWidth(30, UNITS_PERCENTAGE); 
     CheckBox c = new CheckBox(" filtro " + i); 
     c.setWidth(30, UNITS_PERCENTAGE); 
     c.setData(i); 
     c.setImmediate(true); 
     c.addListener(new ValueChangeListener() { 
      @Override 
      public void valueChange(ValueChangeEvent event) { 
       // within this, could I access the respective row ID 
       // (i) then enable/disable TextField t on second column ? 
       System.out.println("event.getProperty().getValue()=" 
         + event.getProperty().getValue()); 
      } 
     }); 
     table.addItem(new Object[] { c, t }, i); 
    } 
    return table; 
} 

感谢

回答

2

你的代码一些改变成为可能。 不是最完美的方式,但te最简单。

首先,您必须将第二列(Valor)设置为TextField.class而不是String.class

这里的变化:

table.addContainerProperty("Valor", TextField.class, null); 

而不是坚持让变量i在CheckBox.setData(),我建议你到你的复选框链接到同一行的文本字段,就像这样:

c.setData(t); 

最后,我对你的听众几乎没有什么改变:

c.addListener(new Property.ValueChangeListener() { 
      public void valueChange(ValueChangeEvent event) { 

       CheckBox checkBox = (CheckBox)event.getProperty(); 
       if((Boolean) checkBox.getValue()) 
       { 
        TextField associatedTextField = (TextField)checkBox.getData(); 

        //Do all your stuff with the TextField 
        associatedTextField.setReadOnly(true); 
       } 
      } 
     }); 

希望我为你工作!

的问候,埃里克

+0

谢谢,埃里克。它的工作就像一个魅力;) – Rodolfo

0
public class MyCheckBox extends CheckBox { 

    private TextBox t; 

    public MyCheckBox(TextBox t) { 

    this.t = t; 
    attachLsnr(); 
    } 

    private void attachLsnr() 
    { 
    addListener(new Property.ValueChangeListener() { 
       public void valueChange(ValueChangeEvent event) { 

        CheckBox checkBox = (CheckBox)event.getProperty(); 
        if((Boolean) checkBox.getValue()) 
        { 
         t.setReadOnly(true); 
        } 
       } 
      }); 


    } 

} 
+1

请避免只是发布代码,而是解释你发布的代码,以便操作系统明白你做了什么,并且这个网站不会变成“为我写代码”的网站。 – ThreeFx

相关问题