Форма перехода с кодовым именем One автоматически прокручивается вверх - PullRequest
0 голосов
/ 29 декабря 2018

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

Компоненты, ScaleImageButtons и -Labels добавляются в форму напрямую через GridLayout.Существуют также события таймера, чтобы сделать сценарий более динамичным и привлекательным

Форма, конечно, прокручиваемая.

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

Но форма должна оставаться в текущей позиции прокрутки, независимо от позиции анимированного элемента, независимо от того, виден он или нет.

Как можно заставить форму сохранять текущую позицию прокрутки, независимо от позиции текущего анимированного элемента?

 formApps.setFocusScrolling(false); // does not help

Вот код:

(Этот код был отредактирован, чтобы отражать рабочее решение)

Form formApps = new Form(new GridLayout(6, 2)); 
ArrayList<String> listApps = classStrings.listApps;

for (int i = 0; i < listApps.size(); i++) {

     Container container = new Container();
     ScaleImageButton scaleImageButton = new ScaleImageButton(image);
     SpanButton spanButton = new SpanButton(stringDescrip);

     container.add(scaleImageButton);

     UITimer uit00 = new UITimer(() -> {

        UITimer uit01 = new UITimer(() -> {

            container.replace(spanButton, scaleImageButton,
                    CommonTransitions.createCover(CommonTransitions.SLIDE_HORIZONTAL, true, slideInterval));

        });
        uit01.schedule(startInterval, false, formApps);

        UITimer uit02 = new UITimer(() -> {

            container.replace(scaleImageButton, spanButton,
                    CommonTransitions.createCover(CommonTransitions.SLIDE_HORIZONTAL, true, slideInterval));

        });
        uit02.schedule(repeatIntervalOne, false, formApps);

    });
    uit00.schedule(repeatIntervalOne, true, formApps);
});

form.setFocusScrolling(false);
form.add(container);
container.setScrollableY(true);
formApps.show();

1 Ответ

0 голосов
/ 29 декабря 2018

Вы не должны использовать Timer здесь напрямую.Это нарушает EDT .Вы должны либо обернуть обратный вызов таймера в callSerially, либо, что еще лучше, просто использовать UITimer, который разработан именно для этой цели.

6x2 - это относительно небольшая сетка, поэтому вполне возможно, что небольшого движения достаточно, чтобы отправить вас на вершину, когда размеры элементов изменяются.Размер сетки определяется предпочтительным размером всех элементов внутри.Если scaleImageButton намного больше, чем spanButton после их замены, макет может «подпрыгнуть», и в результате вы получите нечто гораздо меньшее, похожее на прокрутку, но просто новое макет из-за меньшего предпочтительного размера.

Обходной путь для этого будет:

Component.setSameSize(scaleImageButton, spanButton);
...