(вложенный?) анонимные внутренние классы для кнопок - PullRequest
5 голосов
/ 14 февраля 2010

Я использовал внутренний класс 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 ]

1 голос
/ 14 февраля 2010

Ваш синтаксис неверен в третьем примере, но в любом случае использование анонимного класса в этом случае невозможно. Вы пытаетесь вызвать 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());
0 голосов
/ 14 февраля 2010

Наиболее эффективный способ (как с точки зрения GWT, так и количества кода) - реализовать для вашего класса ClickHandler, а затем для каждой строки создать new 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: Может быть, вам стоит подумать об использовании IDE, такой как Eclipse (с Плагином Google для Eclipse ) - это делает разработку GWT быстрым и выявляет синтаксические ошибки, подобные той, что была в вашем последнем фрагменте кода. 1015 *

...