Компоненты в разных столбцах не знают друг друга, так как все они определены в отдельной области видимости (в componentRenderer их собственного столбца. Вы не можете определить Button за пределами componentRenderer, как вы узнали из другого вопроса сегодня),Таким образом, «очевидное» решение не будет работать, когда вы добавите clickListener на кнопку, чтобы напрямую изменить другие кнопки.
Если бы у вас был один столбец с 3 кнопками внутри, тогда это было бы намного проще.
Есть способ, но я считаю это скорее взломом, чем решением. Потому что вам нужна дополнительная реализация в классе элементов, чтобы это работало.
В ComponentRenderer вы можете добавить оператор if, где вы смотрите на какое-то значение элемента. В одном случае вы визуализируете кнопку 1, в другом - другую кнопку. И в обработчиках щелчков кнопки вы изменяете это значение в элементе и обновляете поставщик данных, так что componentRenderer вызывается снова. Теперь он увидит, что значение элемента изменилось, поэтому отображается какая-то другая кнопка.
Вот код, показывающий, что я имею в виду:
// grid item class
public class Foo {
private boolean buttonPressed = false;
public Foo(){
}
public isButtonPressed(){
return buttonPressed;
}
public setButtonPressed(boolean buttonPressed){
this.buttonPressed = buttonPressed;
}
}
// adding of button columns
// do this 3 times for a test of your scenario.
grid.addComponentColumn(item -> {
if(!item.isButtonPressed()){
return new Button("Before Button was Pressed", click -> {
item.setButtonPressed(true);
grid.getDataProvider().refresh(item);
});
} else {
return new Button("Button was Pressed", click -> {
item.setButtonPressed(false);
grid.getDataProvider().refresh(item);
})
}
})