5

我使用匿名内部类来获取按钮 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
    }
});
);

但是,这根本不会编译(第一个;我猜),我有点迷茫——我怎样才能实现这个效果?

谢谢

4

2 回答 2

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());
于 2010-02-14T02:33:36.180 回答
0

最有效的方法(从 GWT 和代码量的角度来看)是让您的类实现ClickHandler,然后为每一行创建一个 Button的(您不能将相同的Widget两次添加到 DOM):

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: Maybe you should consider using an IDE like Eclipse (with the Google Plugin for Eclipse) - it makes GWT development a breeze and would catch syntax errors like the one in your last code snippet.

于 2010-02-14T10:40:01.110 回答