首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CellTable点击吞咽

CellTable点击吞咽
EN

Stack Overflow用户
提问于 2016-01-28 16:45:33
回答 2查看 151关注 0票数 5

我有一个组合框,它由一个文本字段和一个弹出窗口组成,其中CellTable显示建议项。文本字段有一个更新CellTable所选内容的更改处理程序。

键入字符并单击已选定的建议时,第一次单击将被吞食。第二次单击工作,并通过CellTable.addDomHandler(.)触发选择。

知道为什么第一次点击被吞没了吗?

示例代码:

代码语言:javascript
复制
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;
        }

    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-04 12:39:08

我转载了您的问题,问题是:当您单击建议时,会发生以下情况:

  • 文本字段正在松散焦点,这将导致相应的ChangeEvent被处理,然后是BlurEvent。
  • 单击使弹出窗口现在获得焦点,这就是为什么它被吞没了。

如果删除文本字段的ChangeHandler和BlurHandler,则问题将消失。但我想我找到了另一种解决方案,尝试将mTable的DOM处理程序替换为相对于mTableSelection的选择处理程序,如下所示:

代码语言:javascript
复制
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();
                    }
                });
            }

        });
票数 1
EN

Stack Overflow用户

发布于 2016-06-21 13:26:28

找到了正确解决这个问题的方法。

当用户悬停建议列表区域时,跳过模糊处理程序似乎解决了这个问题,至少从已经完成的测试中看不到任何问题。

这是必要的,因为就在用户单击建议项之前,文本是模糊的,它会触发选择更改。这反过来又会取消用户单击某项时所作的选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35067173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档