我有一个包含许多使用幻灯片过渡的组件的应用程序。
直接通过GridLayout将组件ScaleImageButtons和-Label添加到窗体。还涉及计时器事件,以使场景更加动态和吸引人
该表格当然是可滚动的。
现在,每次我调用表单并将其向下滚动时,一旦它变为动画,它将自动跳回到表单顶部的第一项。
但是该窗体应保持在当前滚动位置,而与动画项目的位置无关,无论该可见与否。
如何使表单保持当前滚动位置,而与当前动画项目的位置无关?
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();
答案 0 :(得分:1)
您不应在此处直接使用Timer
。 violates the EDT。您应该将计时器回调包装在callSerially
中,或者更好地使用UITimer
,它是专门为此目的而设计的。
6x2是一个相对较小的网格,因此,随着元素大小的调整,很小的移动就足以使您到达顶部。网格的大小由其中所有元素的首选大小确定。如果scaleImageButton
比spanButton
大得多,则布局可能会“跳跃”,您最终会得到小得多的感觉,就像滚动一样,但由于较小的首选尺寸而只是一种新布局
一种解决方法是:
Component.setSameSize(scaleImageButton, spanButton);