2010-02-14 3 views
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 
    } 
}); 
); 

Однако, это не будет собирать на всех (первый, я думаю), я немного потерял - как я могу добиться этого эффекта?

Благодаря

+1

Я считаю, что последний фрагмент будет скомпилирован, если вы удалите последний ');' – MatrixFrog

ответ

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()); 
+2

+1 Кроме того, возможно расширение «Button» и реализация «ClickHandler». – trashgod

+0

спасибо! это работает. trashgod, не уверен, что я полностью следую - вы имеете в виду, что я должен определить класс и просто создать (anon?) его экземпляры в setWidget? – malangi

+0

Нет, я думаю, он имел в виду это как создание нового класса (может быть private, package/default, inner - зависит от области действия, в которой вы хотите его использовать) следующим образом: 'MyButton extends Button реализует ClickHandler', а затем реализует и устанавливает «ClickHandler», как и в моем ответе, большая разница заключается в том, что вам действительно не нужно расширять «Button» (и это фактически обескуражено) - поскольку вы не вводите никаких других пользовательских действий, вы просто хотите передать общее 'ClickHandler' для многих кнопок. –

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

+0

Спасибо за это - я думаю, что затмение действительно выглядит как путь вперед. Я хочу использовать эти кнопки в цикле, поэтому я думаю, что определение их по отдельности действительно не кажется практичным, но я вижу вашу точку зрения о манипуляторе кликов, это должно сделать код намного чище. Спасибо! – malangi

Смежные вопросы