为什么无法更新自动完成建议?

时间:2018-09-20 14:56:08

标签: codenameone

我正在使用两个AutocompleteTextFilters作为依赖过滤器。我希望第二个过滤器根据第一个过滤器的建议更改其选项。

我在第一个过滤器上绑定了一个事件侦听器,以便当它失去焦点时会在第二个过滤器上触发一个过程。

问题是第二个过滤器从不更改其选项。我什至设置了硬编码的值,以防万一我的代码有问题,但是没有运气。

我使用的代码如下:

public CreateSubmission(com.codename1.ui.util.Resources resourceObjectInstance, Map<String, ProjectType> projectTypes) {
        this.projectTypes = projectTypes;
        initGuiBuilderComponents(resourceObjectInstance);
        gui_ac_projecttype.clear();
        gui_ac_projecttype.setCompletion( this.projectTypes.keySet().toArray( new String[0]) );
        gui_ac_projecttype.addFocusListener( new ProjectTypeFocusListener( this ));
        gui_ac_steps.setCompletion( new String[]{"t10", "t20"});

    }

    public void makeSteps (String selection) {
            ProjectType projectType = this.projectTypes.get( selection );
            if (projectType != null) {
                this.selectedProjectType = selection;

                int length = projectType.projectSteps.length;

                String[] steps = new String[ length ];
                for(int i =0; i < length; i ++) {
                    steps[i] = projectType.projectSteps[i].projectStep;
                }           

               // String[] s = gui_ac_steps.getCompletion();

                gui_ac_steps.setCompletion( new String[]{"t1", "t2"} );

                gui_ac_steps.repaint();
            }
            else {

            }

        }

public class ProjectTypeFocusListener implements FocusListener{
        private CreateSubmission parent;
        public ProjectTypeFocusListener( CreateSubmission parent ) {
            this.parent = parent;
        }
        @Override
        public void focusGained(Component cmp) {
            //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }

        @Override
        public void focusLost(Component cmp) {
            this.parent.makeSteps (
                ((AutoCompleteTextField)cmp).getText()
            );

            //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }
    }

在上面的代码中,初始化发生在“ public CreateSubmission”方法上。 “ gui_ac_projecttype”是第一个通过其FocusListener处理程序(类ProjectTypeFocusListener)触发整个过程的AutocompletionTextField

“ gui_ac_steps”是必须更改其值的第二个AutocompleteTextField过滤器。在上面的代码中,我初始化了对“ t10”,“ t20”的建议。正确显示了这两个值。

后来,我从FoculListenerHandler的方法“ ProjectTypeFocusListener.focusLost”调用了方法“ makeSteps”,该方法将建议选项设置为“ t1”,“ t2”,然后重新绘制该组件。这两个值永远都不会显示。第一个值是“ t10”,“ t20”。

奇怪的是,当我问gui_ac_steps.getCompletion();时,在调试器中查看当前选项(在makeSteps方法中注释掉的代码),我得到了正确的值“ t1”,“ t2”。

但是在屏幕上,它始终显示“ t10”,“ t20”。

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您不应在焦点侦听器中做任何“重要”的事情。特别是没有文本字段。它们有些不可靠,因为文本字段切换到本机编辑,并且实际上将焦点转移到了本地编辑。问题在于,某些事件由于本机编辑的来回原因而延迟,因此,在收到焦点事件时,您已移至下一个字段。

为此特定用例https://www.codenameone.com/blog/dynamic-autocomplete.html

尝试类似的操作