2010-06-08 30 views
12

Có thể là một câu hỏi ngớ ngẩn, nhưng GWT FlowPanel (nguyên tố div thô) không cung cấp một cái gì đó để xử lý một mouseclick/mousemovement trên đó. Ghi đè onBrowserEvent cũng không hoạt động.GWT: Cách xử lý Nhấn vào GWT FlowPanel

Nếu đặt onclick sự kiện sử dụng JavaScript nguyên gốc (cần chỉ định chiều cao dương, 'div' có chiều cao là 0 nếu không được chỉ định), thì hãy bắt các sự kiện này hoạt động bình thường. Có cách nào để làm điều đó mà không cần sử dụng JSNI?

Trả lời

18

Những gì bạn cần làm ở đây là gói FlowPanel của bạn trong FocusPanel. Một FocusPanel chứa tất cả các bộ xử lý có thể và do đó sẽ cho phép bạn có một ClickHandler thiết lập để nó.

Một phương pháp khác là tạo tiện ích của riêng bạn mở rộng bảng lưu lượng và triển khai giao diện cần thiết để có thể chứa ClickHandler.

Cá nhân tôi sẽ đề xuất phương pháp đầu tiên. Nó đơn giản hơn, nhanh hơn để mã và sẽ không làm chậm ứng dụng của bạn.

0

Có vẻ câu hỏi là một câu hỏi câm lặng, vâng. FlowPanel có thể dễ dàng được bọc hoặc thay thế bằng FocusPanel, cung cấp nhiều phương pháp để theo dõi/xử lý sự kiện.

+0

Vâng, nếu tôi hiểu FlowPanel và FocusPanel đúng, bạn không thể thay thế FlowPanel bằng FocusPanel nhưng bạn có thể chắc chắn quấn một FlowPanel trong FocusPanel. – Zwik

+0

Có, 'FocusPanel' là triển khai' SimplePanel', vì vậy nó không thể chứa nhiều hơn một tiện ích con. Nhưng nếu 'FlowPanel' của bạn chỉ chứa một, bạn có thể thay thế nó bằng' FocusPanel' :). –

+2

Vâng, việc sử dụng FlowPanel chỉ cho 1 đứa trẻ sẽ vô dụng. – Zwik

8

Trên thực tế, bạn đi cho việc này:

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

Cheers !!!

+1

Vâng, đó là một chút hack-way nhưng nếu một người dùng bị hạn chế với việc sử dụng FlowPanel, thủ thuật này có thể làm cho một công việc cho anh ta. Cảm ơn –

+0

Nếu tôi có thể cho câu trả lời này nhiều upvotes tôi sẽ. – saihgala

5

này đã làm việc cho tôi (Rõ ràng, thay thế "CLICKHANDLER CỦA BẠN" với tên của clickhandler của bạn):

FlowPanel field = new FlowPanel(); 

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

Giải pháp tốt nhất mà tôi tìm thấy cho điều này là here.

Ý tưởng là mở rộng FlowPanel (hoặc thực sự SimplePanel) để triển khai các giao diện xử lý có liên quan, là tùy chọn nhiều hơn cho các tình huống mà bạn không yêu cầu đầy đủ chức năng và khả năng lấy nét của FocusPanel. Xem dưới đây:

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

Đây cũng là một giải pháp tốt cho những ai không muốn nhận tất cả các loại sự kiện! Cảm ơn! –

0

Chỉ cần quấn FlowPanel với một FocusPanel, mà sẽ để lại sẵn sàng widget cho tương tác người dùng khác quá:

Nguồn:

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