我有一个使用GWT的小型Web应用程序项目,其中一个按钮处理事件:使用小部件填充面板。目前,再次单击该按钮将复制该面板,我希望它清除面板,然后重新添加小部件。
到目前为止,我有:
final Button b = new Button("get schools near me");
final HorizontalPanel panel = new HorizontalPanel();
panel.getElement().setId("distanceTable");
RootPanel.get("core").add(b);
RootPanel.get("core").add(panel);
b.addClickHandler(new ClickHandler(){
@Override
public void onClick(ClickEvent event) {
Timer t = new Timer(){
@Override
public void run() {
//how do you clear the panel here first? before you
// do a bunch of things along the lines of:
panel.add(widget);
panel.add(widget2);
}
};
t.schedule(1400); // wait 1.4 seconds for callback
}
});
我知道你传递给run函数的任何内容都必须作为最终声明,所以我该如何解决这个问题?
答案 0 :(得分:1)
您可以使用clear方法:
DrawerLayout's
答案 1 :(得分:1)
将final HorizontalPanel panel = new HorizontalPanel();
更改为班级属性。然后它可以很容易地传递给内部匿名类。并且您可以使用@ philfr49建议的Timer方法中的clear方法
例如
private HorizontalPanel panel = new HorizontalPanel();
.....
// Elsewhere
.....
final Button b = new Button("get schools near me");
panel.getElement().setId("distanceTable");
RootPanel.get("core").add(b);
RootPanel.get("core").add(panel);
b.addClickHandler(new ClickHandler(){
@Override
public void onClick(ClickEvent event) {
Timer t = new Timer(){
@Override
public void run() {
panel.clear();
panel.add(widget);
panel.add(widget2);
}
};
t.schedule(1400); // wait 1.4 seconds for callback
}
});
答案 2 :(得分:1)
继续对问题的评论 - 建议不要使用计时器等待回调结果。
我假设您正在使用严格的模型 - 视图 - 控制器分离,并且您打印的代码是View部分,回调发生在单独的Controller类中。
现在,如果面板中没有添加很多东西,我会使用以下构造:
/*
* contains all the display parts of the appliation
*/
class View{
private HorizontalPanel panel = new HorizontalPanel(); // panel as a field
/*
* Getter for panel
*/
public HorizontalPanel getPanel(){
return this.panel;
}
/**
* Method to create the display part for 'Schools Near Me'
*
* @param schoolsNearMeHandler Clickhandler that decides what happens
* when the 'near me' button is clicked
* Contains code to request from server
* and display server result
*/
public void createSchoolsNearMeSection(ClickHandler schoolsNearMeHandler){
final Button b = new Button("get schools near me");
panel.getElement().setId("distanceTable");
RootPanel.get("core").add(b);
RootPanel.get("core").add(panel);
b.addClickHandler(schoolsNearMeHandler);
}
}
/*
* Creates and operates the View and makes sure the correct things get displayed
*/
class Controller{
private View view;
public Controller(){
// since the Controller drives the Model-View-Controller part,
// the view is being created here
view = new View();
// TODO more code to set up the view to perfection
// Create the 'schools near me' section
view.createSchoolsNearMeSection(new ClickHandler(){
@Override
public void onClick(ClickEvent event) {
loadSchoolsNearMe(); // send request to server
}
}
}
/**
* Loads schools near me from the server
*/
private void loadSchoolsNearMe(){
// generic callback -- use whatever callback interface is required for your way of requesting data from server
Callback callback = new Callback(){
public void onSuccess(ServerResult result){
// retrieve the panel where you want to display your data
HorizontalPanel panel = view.getPanel();
panel.clear();
// TODO execute whatever code necessary to create
// widget and widget2 from the ServerResult
// display the newly generated widgets
panel.add(widget);
panel.add(widget2);
}
public void onError(...){
// handle errors
}
}
// Create request
Request request = new Request(...);
// Execute request
RequestBuilder.execute(request, callback);
}
}
当然,如果要对服务器结果进行大量复杂的代码和视图构建,您可以再次将显示部分放入View对象,将逻辑保留在Controller中,然后调用相应的View函数显示任何必要的内容。