Использование гиперссылки, возможно, не лучший способ сделать что-то подобное, потому что вы не должны использовать ClickHandler с гиперссылкой.Гиперссылка устанавливает HistoryToken, и вы должны реагировать на изменение истории.
Я бы использовал метку и, возможно, стилизовал бы ее как обычную ссылку, если вы хотите иметь такой же внешний вид.(Я буду использовать метку в следующем примере, но вы можете изменить ее на гиперссылку, если хотите.)
Я бы создал класс, расширяющий метку.Этот класс будет иметь идентификатор, который вы установили в конструкторе.Вы бы отправили этот идентификатор на сервер, чтобы получить новый FlexTable.В конструкторе вы добавляете ClickHandler, который считывает поле id и отправляет его на сервер для получения нового FlexTable.
public class FlexTableLabel extends Label implements ClickHandler {
int id=0;
public FlexTableLabel(String text, int id) {
this.id=id;
this.setText=text;
this.addCickHandler(this);
}
public void onClick(ClickEvent event) {
//sends the id to the server, of course you need to replace it with your
//service
yourService.getNewFlexTable(this.id);
}
}
В вашем цикле вы просто создадите объекты нового класса и дадите ему соответствующийпараметры (я предполагаю, что у вас есть ArrayList с результатом. Объекты в этом ArrayList будут иметь текст и идентификатор):
for(int i=0; i<result.size;i++) {
FlexTable.setWidget(i,0, new FlexTableLabel(result.get(i).text, result.get(i).id);
}
Я надеюсь, что это даст вам хоть что-то для начала, если что-то все еще неясно, оставьтекомментарий, и я постараюсь помочь разобраться в этом.
Редактировать на основе Пост Чираю :
Трудно объяснить что-то подобное беззная ваше приложение.Я обычно реализую Singleton Pattern , чтобы получить конкретный виджет.Поэтому я хотел бы создать класс следующим образом:
public static YourPanel extends Panel {
private static YourPanel instance=null;
public static YourPanel getInstance() {
if(instance==null) {
instance=new YourPanel();
}
return instance;
}
}
В вашем EntryPointClass у вас будет что-то вроде этого:
public class YourEntryClass extends EntryPoint {
public void onModuleLoad() {
RootPanel.get().add(YourPanel.getInstance());
}
}
Теперь вы можете вызывать метод YourPanel.getInstance () вonSuccess () часть вашего сервиса для изменения содержимого панели:
yourService.getNewFlexTable(this.id, new AsyncCallback<ArrayList<String>>() {
public void onSuccess(ArrayList<String> result) {
For(int i=0;i<result.size;i++) {
YourPanel.getInstance().add(result.get(i);
}
}
});
Надеюсь, это поможет.Оставьте комментарий, если это не так.
Пример приложения
Пример запуска приложения
Пример исходного кода приложения