2010-02-14 21 views
5

Mam użył anon wewnętrzną klasę dostać OBJ przycisk:anonimowe klasy wewnętrzne dla przycisków

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 
    } 
}); 

chcę użyć to w dowolnie wielkości GWT FlexTable (który jest w zasadzie auto tabela zmiany rozmiaru).

jeśli mogę coś takiego zrobić:

currentTable.setText(3, 0, "elec3"); 
currentTable.setWidget(3, 2, modButton); 

currentTable.setText(4, 0, "elec4"); 
currentTable.setWidget(4, 2, modButton); 

Przycisk pokazuje tylko do tego ostatniego (ponieważ jest tylko jeden przykład). Ponieważ powyższa tabela zostanie zapełniona programowo, nie jest praktyczne zdefiniowanie nowego przycisku dla każdej możliwej instancji.

Próbowałem tego, co następuje:

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 
    } 
}); 
); 

Jednak nie będzie to skompilować w ogóle (pierwsza, chyba), jestem trochę zagubiony - w jaki sposób można osiągnąć ten efekt?

Dzięki

+1

Wierzę, że ostatni fragment zostanie skompilowany, jeśli usuniesz ostatnie ');' – MatrixFrog

Odpowiedz

1

Twój składnia jest niepoprawna w trzecim przykładzie, ale w każdym przypadku korzystania anonimowy klasy w tym przypadku jest to niemożliwe. Próbujesz wywołać addClickHandler na nowo utworzonym obiekcie, który nie jest przechowywany w żadnej zmiennej. Teoretycznie możesz umieścić ten kod w konstruktorze swojej anonimowej klasy i wywołać tę funkcję w "tym". Problem polega na tym, że ze względu na specyfikę składni anonimowej klasy Javy (absolutnie okropnej) niemożliwe jest zdefiniowanie konstruktora (jak by to nazwać?).

Nie jestem w 100% pewny, że rozumiem, co próbujesz osiągnąć, ale czy możesz zdefiniować funkcję, która właśnie zwróciła nową poprawnie skonfigurowaną instancję przycisku za każdym razem, gdy ją wywołasz? Na przykład,

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; 
} 

Wtedy można by nazwać

currentTable.setWidget(4, 2, newModButton()); 
+2

+1 Alternatywnie, możliwe jest rozszerzenie 'Button' i zaimplementowanie' ClickHandler'. – trashgod

+0

dzięki! to działa. trashgod, nie jestem pewien, czy w pełni podążam - czy masz na myśli, że powinienem zdefiniować klasę i po prostu utworzyć (anon?) jej instancje w setWidget? – malangi

+0

Nie, myślę, że miał na myśli stworzenie nowej klasy (może być prywatne, pakietowe/domyślne, wewnętrzne - w zależności od zakresu, w którym ma być używany): 'MyButton extends Button implementuje ClickHandler', a następnie implementuje i ustawia "ClickHandler", tak jak w mojej odpowiedzi - wielka różnica polega na tym, że tak naprawdę nie musisz rozszerzać 'Button' (i jest to odradzane) - ponieważ nie wprowadzasz żadnego innego niestandardowego zachowania, po prostu chcesz przekazać 'ClickHandler' na wiele' Button'ów. –

0

najbardziej efektywny sposób (zarówno z punktu widzenia GWT i ilości kodu) dla waszej klasy wdrożyć ClickHandler a następnie dla każdego wiersza utworzyć nowyButton (ty nie może dodać taką samą Widget dwukrotnie 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 
    } 

} 

Zauważ, co tu robimy - nie ma żadnych anonimowych klas, implementujemy interfejs ClickHandler raz. Jest to bardziej wydajne niż tworzenie anonimowej klasy dla każdego przycisku (gdy chcesz, aby wszystkie przyciski zachowywały się w ten sam sposób), ponieważ w przeciwnym razie GWT musiałoby utworzyć dodatkowy kod dla każdego dodawanego przycisku - zamiast tego ClickHandler jest zaimplementowany w jednym miejscu i przywoływane przez wszystkie przyciski.

PS: Może powinieneś rozważyć użycie IDE takiego jak Eclipse (z Google Plugin for Eclipse) - to sprawia, że ​​rozwój GWT jest prosty i złapie błędy składniowe, takie jak w twoim ostatnim fragmencie kodu.

+0

Dzięki za to - myślę, że zaćmienie wygląda jak droga naprzód. Chcę używać tych przycisków w pętli, więc domyślam się, że definiowanie ich pojedynczo nie wydaje się praktyczne, ale widzę twój punkt widzenia na clickhandler, to powinno uczynić kod znacznie czystszym. Dzięki! – malangi

Powiązane problemy