Почему нельзя обновить автозаполнение предложений? - PullRequest
0 голосов
/ 20 сентября 2018

Я использую два фильтра AutocompleteTextFilter в качестве зависимых фильтров.Я хочу, чтобы второй фильтр менял свои параметры в зависимости от предложения первого фильтра.

Я привязал прослушиватель событий к первому фильтру, чтобы при потере фокуса он запускал процесс на втором фильтре.

Проблема в том, что второй фильтр никогда не меняет своих настроек.Я даже настроил жестко запрограммированные значения на случай, если что-то не так в моем коде, но не повезло.

Код, который я использую ниже:

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.
        }
    }

В приведенном выше коде инициализация происходит на "publicCreateSubmission "метод."gui_ac_projecttype" является первым AutocompletionTextField, который запускает весь процесс через его обработчик FocusListener (класс ProjectTypeFocusListener)

"gui_ac_steps" - это второй фильтр AutocompleteTextField, который должен изменить свои значения.По приведенному выше коду я инициализирую его предложения «t10», «t20».Эти два значения отображаются правильно.

Позже из-за метода FoculListenerHandler «ProjectTypeFocusListener.focusLost» я вызываю метод «makeSteps», который устанавливает параметры предложения в «t1», «t2, а затем перерисовываю компонент.два последних значения никогда не отображаются. Оно остается на первых значениях «t10», «t20».

Странно то, что в отладчике, когда я спрашиваю gui_ac_steps.getCompletion (), чтобы увидеть текущие параметры (код, который закомментирован в метод makeSteps) Я получаю правильные значения "t1", "t2".

Но на экране он продолжает отображать "t10", "t20".

anyпомощь оценена.

1 Ответ

0 голосов
/ 21 сентября 2018

Вы не должны делать ничего «важного» в фокусном слушателе.Особенно не с текстовым полем.Они несколько ненадежны, потому что текстовое поле переключается на собственное редактирование и фактически переносит фокус там.Проблема заключается в том, что некоторые события задерживаются из-за перемотки назад и вперед с собственным редактированием, поэтому к моменту получения события фокуса вы переходите к следующему полю.

Попробуйте что-то подобное для этого конкретногослучай использования https://www.codenameone.com/blog/dynamic-autocomplete.html

...