2016-01-28 6 views
5

Ich habe ein Kombinationsfeld, das aus einem Textfeld und einem Popup mit einem CellTable besteht, das die vorgeschlagenen Elemente zeigt. Das Textfeld hat einen Änderungshandler, der die Auswahl der CellTable aktualisiert.CellTable klicken geschluckt

Wenn Sie ein Zeichen eingeben und auf einen bereits ausgewählten Vorschlag klicken, wird der erste Klick verschluckt. Der zweite Klick funktioniert und löst die Auswahl über den CellTable.addDomHandler (...) aus.

Eine Idee, warum der erste Klick verschluckt wird?

Beispielcode:

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

Können Sie Beispielcode posten? Gibt es einen Unterschied, wenn Sie auf nicht ausgewählten Vorschlag klicken? Warum verwenden Sie nicht [GWT SuggestBox] (http://www.gwtproject.org/javadoc/latest/com/google/gwt/user/client/ui/SuggestBox.html)? – Adam

Antwort

1

ich Ihr Problem reproduziert und hier ist das Problem: , wenn Sie auf den Vorschlägen klicken Sie auf die folgende geschieht:

  • Das Textfeld den Fokus verliert, die bewirkt, dass das entsprechende ChangeEvent, gefolgt von dem BlurEvent.
  • Der Klick bewirkt, dass das Popup jetzt den Fokus erhält, weshalb es verschluckt wird.

Wenn Sie den ChangeHandler und den BlurHandler des Textfelds entfernen, verschwindet das Problem. Aber ich denke, dass ich eine andere Lösung gefunden, die DOM-Handler des Mtable mit einem Auswahl-Handler in Bezug auf den mTableSelection Versuchen Sie ersetzen wie folgt:

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

Danke und es ist eine nette Idee, das ursprüngliche Problem zu lösen, nur ein Nebeneffekt ist, dass der Fokus auf den Text verloren geht, wenn der Benutzer den Tisch einfach schwebt, ohne zu klicken. Dies stoppt die Bearbeitung und würde als Fehler angesehen werden. Aber danke, dass du versucht hast, das Beispiel zu führen und zu helfen, damit ich dir das Kopfgeld zuweisen kann, wenn keine andere Antwort auf dem Weg kommt. –

0

einen Weg gefunden, wie man richtig diese zu lösen.

Das Überspringen des Blur-Handlers, wenn der Benutzer den Vorschlagslistenbereich schwebt, schien dieses Problem zu beheben, zumindest von den durchgeführten Tests wurden keine weiteren Probleme festgestellt.

Dies war erforderlich, da der Text vor dem Klicken auf einen Vorschlagsartikel unscharf ist und eine Auswahländerung ausgelöst wird. Dies wiederum bricht die Auswahl ab, wenn der Benutzer auf einen Gegenstand klickt.