Ситуация 1: кнопка находится за пределами сетки
Вы можете определить SelectionListener
в сетке, где вы можете проверить свои критерии для выбранного элемента. В зависимости от этого результата вы вызываете button.setVisible(itemFulfillsCriteria);
// assuming a single select grid
grid.addSelectionListener(selection -> {
boolean showButton = false;
MyItem selectedItem = selection.getFirstSelectedItem().orElse(null);
if(selectedItem != null && selectedItem.getFoo() == Foo.BAR){ // show button only if item.foo == BAR
showButton = true;
}
myButton.setVisible(showButton);
//myButton.setEnabled(showButton); // if you want to disable instead of hide.
}
Ситуация 2: кнопка для каждой строки сетки
Когда вы добавляете столбец для этой кнопки, вы можете проверить внутри Рендерер, если элемент соответствует наличию этой кнопки видимой.
grid.addComponentColumn(item -> {
if(item.getFoo() == Foo.BAR) {
return new Button("click me", click -> {
// do something when clicked
});
} else {
return new Span(); // don't return null, as that would cause exception. Instead, return empty Span.
}
})
.setKey("someAction")
.setHeader("Do the thing");
Ситуация 3: нет сетки, но есть Binder
Когда у вас есть переплет и вы хотите показать / скрыть или включить / Отключить компонент, основываясь на значениях связанных элементов, вы можете определить ValueChangeListener
для самого подшивки. В любое время, когда значение связанного входного поля изменяется, этот слушатель будет срабатывать, и тогда вы сможете проверить, соответствует ли связанный элемент вашему критерию, и действовать соответствующим образом.
binder.addValueChangeListener(changeEvent -> {
MyItem boundItem = binder.getBean();
button.setVisible(boundItem.getFoo() == Foo.BAR);
//button.setEnabled(boundItem.getFoo() == Foo.BAR);
}