2016-01-28 24 views
5

Mam pole kombi składające się z pola tekstowego i wyskakującego okienka z tabelą CellTable z propozycjami. Pole tekstowe zawiera procedurę zmiany, która aktualizuje wybór CellTable.kliknięcie kliknięcia CellTable

Po wpisaniu znaku i kliknięciu już wybranej sugestii pierwsze kliknięcie zostanie połknięte. Drugie kliknięcie działa i wyzwala zaznaczenie poprzez CellTable.addDomHandler (...).

Każdy pomysł, dlaczego pierwsze kliknięcie zostanie połknięte?

Przykładowy kod:

private static class SuggestFieldTextAndPopupSandbox extends SimplePanel { 
     private final TextField mText; 
     private CellTable<Handle<String>> mTable; 
     private SingleSelectionModel<Handle<String>> mTableSelection; 
     private SingleSelectionModel<Handle<String>> mSelection; 
     private ProvidesKey<Handle<String>> mKeyProvider = new SimpleKeyProvider<Handle<String>>(); 
     private PopupPanel mPopup; 
     private List<Handle<String>> mData; 

     public SuggestFieldTextAndPopupSandbox() { 
      mData = Lists.newArrayList(new Handle<String>("AAA"), new Handle<String>("AAB"), new Handle<String>("ABB")); 
      mSelection = new SingleSelectionModel<Handle<String>>(); 

      mText = new TextField(); 
      mText.addKeyPressHandler(new KeyPressHandler() { 
       @Override 
       public void onKeyPress(KeyPressEvent pEvent) { 
        mPopup.showRelativeTo(mText); 
       } 
      }); 
      mText.addBlurHandler(new BlurHandler() { 
       @Override 
       public void onBlur(BlurEvent pEvent) { 
        mTableSelection.setSelected(startsWith(mText.getValue()), true); 
       } 
      }); 
      mText.addChangeHandler(new ChangeHandler() { 

       @Override 
       public void onChange(ChangeEvent pEvent) { 
        mText.setText(mText.getText().toUpperCase()); 
       } 
      }); 

      mTable = new CellTable<Handle<String>>(0, GWT.<TableResources>create(TableResources.class)); 

      mTable.setTableLayoutFixed(false); 
      mTableSelection = new SingleSelectionModel<Handle<String>>(mKeyProvider); 
      mTable.setSelectionModel(mTableSelection); 
      mTable.addDomHandler(new ClickHandler() { 
       @Override 
       public void onClick(final ClickEvent pEvent) { 
        Scheduler.get().scheduleFinally(new ScheduledCommand() { 

         @Override 
         public void execute() { 
          mSelection.setSelected(mTableSelection.getSelectedObject(), true); 
          mText.setFocus(true); 
          mPopup.hide(); 
         } 
        }); 
       } 
      }, ClickEvent.getType()); 
      mTable.addColumn(new TextColumn<Handle<String>>() { 
       @Override 
       public String getValue(Handle<String> pObject) { 
        return pObject.get(); 
       } 
      }); 
      mTable.setRowData(mData); 

      mPopup = new PopupPanel(); 
      mPopup.setAutoHideEnabled(true); 
      mPopup.setWidget(mTable); 
      mPopup.setWidth("200px"); 
      mPopup.setHeight("200px"); 

      VerticalPanel p = new VerticalPanel(); 
      p.add(mText); 
      setWidget(p); 
     } 

     private Handle<String> startsWith(final String pValue) { 
      final String val = nullToEmpty(pValue).toLowerCase(); 
      int i = 0; 
      for (Handle<String> item : mData) { 
       String value = item.get(); 
       if (value != null && value.toLowerCase().startsWith(val)) { 
        return item; 
       } 
       i++; 
      } 
      return null; 
     } 

    } 
+0

Czy możesz podać przykładowy kod? Czy jest jakaś różnica, gdy klikniesz na nie wybraną sugestię? Dlaczego nie używasz [GWT SuggestBox] (http://www.gwtproject.org/javadoc/latest/com/google/gwt/user/client/ui/SuggestBox.html)? – Adam

Odpowiedz

1

I zamieszczonym swój problem i tutaj jest problem: po kliknięciu na sugestie Poniżej znajduje dzieje:

  • Pole tekstowe jest utrata ostrości, co powoduje odpowiedni Event, który ma zostać rozpatrzony, a następnie BlurEvent.
  • Kliknięcie powoduje, że wyskakujące okienko staje się teraz aktywne, dlatego jest połknięte.

Usunięcie ChangeHandler i BlurHandler z pola tekstowego powoduje zniknięcie problemu. Ale myślę, że znalazłem inne rozwiązanie Spróbuj wymienić obsługi DOM z mTable z procedury obsługi dobór stosunku do mTableSelection następująco:

mTableSelection.addSelectionChangeHandler(new Handler(){ 

      @Override 
      public void onSelectionChange(SelectionChangeEvent event) { 
       Scheduler.get().scheduleFinally(new ScheduledCommand() { 

        @Override 
        public void execute() { 
         mSelection.setSelected(mTableSelection.getSelectedObject(), true); 
         mText.setFocus(true); 
         mPopup.hide(); 
        } 
       }); 
      } 

     }); 
+0

Dzięki i dobrze jest rozwiązać oryginalny problem, tylko jeden efekt uboczny polega na tym, że nacisk na tekst zostaje utracony, gdy użytkownik po prostu unosi stół bez klikania. Spowoduje to zatrzymanie edycji i będzie postrzegany jako błąd. Ale dziękuję za próbę uruchomienia przykładu i pomocy, więc mogę przypisać ci nagrodę, jeśli po drodze nie znajdziesz innej odpowiedzi. –

0

znaleźli sposób, jak prawidłowo rozwiązać ten.

Pominięcie programu do usuwania plam, gdy użytkownik unosi obszar listy sugestii, najwyraźniej naprawia ten problem, przynajmniej z testów, które zostały wykonane, nie było już żadnych problemów.

Było to konieczne, ponieważ tuż przed kliknięciem sugestii przez użytkownika tekst jest rozmazany i powoduje zmianę wyboru. To z kolei anuluje wybór dokonany, gdy użytkownik kliknie element.