如何使用Vaadin表组件启用/禁用单元格?

时间:2011-09-23 22:47:58

标签: vaadin

我有一个包含2列的表:一个复选框和一个文本字段。我想根据相应的(同一行)复选框状态禁用文本字段。如果选中该复选框,则文本字段将被清除并且只读。这可能吗 ?这是我的代码:

@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 个答案:

答案 0 :(得分:2)

您的代码几乎没有任何变化。 不是最好的方式,但最简单。

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

这里有变化:

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

我建议您将checkBox链接到同一行的TextField,而不是保留CheckBox.setData()中的变量i,如下所示:

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);
                }
            }
        });

希望它对你有用!

问候,Éric

答案 1 :(得分: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);
                    }
                }
            });


    }

 }