(嵌套?)按钮的匿名内部类

时间:2010-02-14 02:01:06

标签: java gwt inner-classes

我使用了一个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
    }
});
);

然而,这根本不会编译(第一个;我猜),我有点迷失 - 我怎么能达到这个效果?

由于

2 个答案:

答案 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开发变得轻而易举,并且会捕获语法错误,就像上一个代码段中的错误一样。