2011-09-23 87 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

相關問題