我使用了一个anon内部类来获取按钮obj:
Button modButton = new Button("Modify");
modButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
//TODO: link to a pop-up, and do a refresh on exit
}
});
我想在任意大小的GWT FlexTable(基本上是一个自动重新调整大小的表)中使用它。
如果我做这样的事情:
currentTable.setText(3, 0, "elec3");
currentTable.setWidget(3, 2, modButton);
currentTable.setText(4, 0, "elec4");
currentTable.setWidget(4, 2, modButton);
该按钮仅显示后一个按钮(因为只有一个实例)。由于上面的表格将以编程方式填充,因此为每个可能的实例定义一个新按钮并不实际。
我尝试了以下内容:
currentTable.setText(4, 0, "elec4");
currentTable.setWidget(4, 2, new Button("Modify");
modButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
//TODO: link to a pop-up, and do a refresh on exit
}
});
);
然而,这根本不会编译(第一个;我猜),我有点迷失 - 我怎么能达到这个效果?
由于
答案 0 :(得分:1)
在第三个示例中,您的语法不正确,但无论如何,在这种情况下使用匿名类是不可能的。您试图在新实例化的对象上调用addClickHandler,该对象不存储在任何变量中。从理论上讲,您可以将该代码放在匿名类的构造函数中,并在“this”上调用该函数。问题是,由于Java(绝对残酷的)匿名类语法的特殊性,不可能定义构造函数(它会被称为什么?)。
我并不是100%确定我理解你要完成的任务,但是你能定义一个函数,每次调用它时都会返回一个新的,正确配置的按钮实例吗?例如,
private Button newModButton() {
Button modButton = new Button("Modify");
modButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
//TODO: link to a pop-up, and do a refresh on exit
}
});
return modButton;
}
然后你会打电话给
currentTable.setWidget(4, 2, newModButton());
答案 1 :(得分:0)
最有效的方式(从GWT和代码数量的角度来看)是您的班级实施ClickHandler
然后为每一行创建新 Button
(你不能两次向DOM添加相同的Widget
:
class Foo extends Composite implements ClickHandler {
public Foo() {
FlexTable currentTable = new FlexTable();
Button button = new Button("Button1");
// Add this class as the ClickHandler
button.addClickHandler(this);
currentTable.setText(3, 0, "elec3");
currentTable.setWidget(3, 2, button);
button = new Button("Button2");
// Add this class as the ClickHandler
button.addClickHandler(this);
currentTable.setText(4, 0, "elec4");
currentTable.setWidget(4, 2, modButton);
}
public void onClick(ClickEvent event) {
//TODO: link to a pop-up, and do a refresh on exit
}
}
注意我们在这里做了什么 - 没有匿名类,我们实现了一次ClickHandler接口。这比为每个按钮创建一个匿名类更有效(当你希望所有按钮的行为方式相同时),因为否则GWT必须为你添加的每个按钮创建额外的代码 - 相反,ClickHandler在一个地方实现并由所有按钮引用。
PS:也许您应该考虑使用像Eclipse这样的IDE(使用Google Plugin for Eclipse) - 它使GWT开发变得轻而易举,并且会捕获语法错误,就像上一个代码段中的错误一样。