2010-06-08 11 views
12

Może to głupie pytanie, ale GWT FlowPanel (surowy element div) nie zapewnia czegoś do obsłużenia go mouseclick/mousemovement. Przesłanianie onBrowserEvent również nie działa.GWT: Jaki jest sposób obsługi Kliknij na GWT FlowPanel

Jeśli ustawisz zdarzenie onclick przy użyciu natywnego JavaScript (musisz określić dodatnią wysokość przed, "div" ma wysokość 0, jeśli nie jest określona), to przechwytywanie tych zdarzeń działa poprawnie. Czy istnieje sposób, aby to zrobić bez korzystania z JSNI?

Odpowiedz

18

Należy tutaj zawinąć panel FlowPanel w FocusPanel. FocusPanel zawiera wszystkie możliwe programy obsługi, dzięki czemu można ustawić dla niego opcję ClickHandler.

Inną metodą byłoby utworzenie własnego widgetu rozszerzającego panel przepływu i implementującego niezbędny interfejs, aby móc zawierać ClickHandler.

Ja osobiście poleciłbym pierwszą metodę. Jest prostszy, szybszy do kodowania i nie spowalnia aplikacji.

0

Wydaje się, że pytanie jest głupie, tak. FlowPanel może być łatwo zapakowany lub zastąpiony przez FocusPanel, który zapewnia wiele metod monitorowania/obsługi zdarzeń.

+0

dobrze, jeśli dobrze rozumiem FlowPanel i FokusPanel, nie można zastąpić FlowPanel przez FocusPanel, ale można oczywiście zawinąć FlowPanel w FocusPanel. – Zwik

+0

Tak, 'FocusPanel' jest implementacją' SimplePanel', więc nie może zawierać więcej niż jednego widżetu podrzędnego. Ale jeśli twój "FlowPanel" zawiera tylko jeden, możesz po prostu zastąpić go 'FocusPanel' :). –

+2

Cóż, używanie FlowPanel dla tylko 1 dziecka byłoby bezużyteczne. – Zwik

8

Faktycznie, idziesz na to:

FlowPanel fPanel = new FlowPanel() { 
     @Override 
     public void onAttach() { 
      super.onAttach(); 
      super.addDomHandler(handler, ClickEvent.getType()); // handler is the instance   
                   // of your ClickHandler 
     } 
} 

Cheers !!!

+1

Tak, jest to trochę hack-way, ale jeśli użytkownik jest ograniczony z wykorzystaniem FlowPanel, ta sztuczka może zrobić dla niego pracę. Dzięki –

+0

Gdybym mógł podać tę odpowiedź, zrobiłbym wiele przebojów. – saihgala

5

Ten pracował dla mnie (oczywiście zastąpić „Twój clickHandler” z nazwą Twojego clickHandler'S):

FlowPanel field = new FlowPanel(); 

field.addDomHandler(YOUR CLICKHANDLER, ClickEvent.getType()); 
6

Najlepszym rozwiązaniem znalazłem tego było here.

Chodzi o to, aby rozszerzyć FlowPanel (lub wręcz SimplePanel), aby wdrożyć odpowiednie interfejsy handlerów, co jest znacznie prostszą opcją w sytuacjach, w których nie wymaga się pełnej funkcjonalności i możliwości ustawiania ostrości w FocusPanel. Patrz poniżej:

public class MouseAwareFlowPanel extends FlowPanel implements 
HasMouseOverHandlers, HasMouseOutHandlers, HasClickHandlers 
{ 
    public HandlerRegistration addMouseOverHandler(MouseOverHandler handler) 
    { 
     return addDomHandler(handler, MouseOverEvent.getType()); 
    } 
    public HandlerRegistration addMouseOutHandler(MouseOutHandler handler) 
    { 
     return addDomHandler(handler, MouseOutEvent.getType()); 
    } 
    public HandlerRegistration addClickHandler(ClickHandler handler) 
    { 
     return addDomHandler(handler, ClickEvent.getType()); 
    } 
} 
+0

To również dobre rozwiązanie dla tych, którzy nie chcą otrzymywać wszystkich typów wydarzeń! Dzięki! –

0

Wystarczy owinąć FlowPanel z FocusPanel, że pozostawi gotowy widget dla innych interakcji użytkownika TOO:

Źródło:

FlowPanel flowPanel = new FlowPanel(); 
    FocusPanel focusPanel = new FocusPanel(flowPanel); 
    focusPanel.addClickHandler(new ClickHandler() { 
     @Override 
     public void onClick(ClickEvent event) { 
      Window.alert("Hi!"); 
     } 
    });