Я начал думать о вашей проблеме и впервые заметил, что вместо использования addDomHandler
вы можете изменить текущий addButton1ClickHandler(ClickHandler handler)
просто на:
public HandlerRegistration addButton1ClickHandler(ClickHandler handler) {
return button1.addClickHandler(handler);
}
Если у вас была только одна кнопка, вы можете открыть ее,заставить ваш Composite реализовать HasClickHandlers и реализовать метод, описанный ниже, чтобы передать его вашей кнопке:
@Override
public HandlerRegistration addClickHandler(ClickHandler handler) {
return button1.addClickHandler(handler);
}
Но поскольку у вас много кнопок, вам нужен метод, который берет нужную кнопкучтобы добавить свой clickHandler в качестве параметра, такого как:
public HandlerRegistration addClickHandlerToButton(ClickHandler handler, Button target){
return target.addClickHandler(handler);
}
Проблема этого подхода заключается в том, что для его использования вам необходимо иметь ссылку на ваши кнопки, что означает, что вам нужно определить методы получения для ваших кнопокв вашем композите, например public Button getButton1()
.Когда вы выставляете свои кнопки таким образом, проблема заключается в том, что вам больше не нужен метод сквозного ввода в композите, так как он / она может в любом случае напрямую обращаться к кнопкам, что делает приведенный выше подход, который использует целевую кнопку в качестве параметра устаревшего.Хуже всего то, что он / она может даже изменить стили и даже отсоединить эти кнопки.
Чтобы решить эту проблему, вы можете выставить свои кнопки через интерфейс HasClickHandlers.
Так что, ИМХО, я так и считаюдолжно быть сделано:
public class ComplexComposite extends Composite {
private Button button1 = new Button("btn1");
private Button button2 = new Button("btn2");
public ComplexComposite(){
HorizontalPanel panel = new HorizontalPanel();
panel.add(button1);
panel.add(button2);
initWidget(panel);
}
public HasClickHandlers getButton1(){
return button1;
}
public HasClickHandlers getButton2(){
return button2;
}
}
При таком подходе вы выставляете свои кнопки только над желаемым интерфейсом, и можно добавить обработчики кликов, такие как:
ComplexComposite composite = new ComplexComposite();
composite.getButton1().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
...
}
});