无法使用scrollComponentToVisible在屏幕上正确强制组件

时间:2017-12-07 21:00:09

标签: codenameone

在给定表单上,我们将一个组件替换为另一个组件。

原始组件是一系列TextFields,新表单是一些信息文本和一个按钮。我们隐藏第一个,并显示第二个(UI设计器在表单中有两个容器)。

我尝试使用scrollRectToVisible各种值,但它似乎与滚动没有任何区别。

 continueButtonContainer.setHidden(false);
 f.forceRevalidate();
 Button continueButton = 
     (Button)StateMachine.GetInstance().findByName("ButtonContinue", f);
 f.scrollComponentToVisible(continueButtonContainer);
 f.scrollComponentToVisible(continueButton);

我希望继续按钮靠近屏幕顶部。

如果在显示“继续”按钮之前滚动屏幕,则按钮会在屏幕底部结束(在我放入scrollComponentToVisible行之前它位于屏幕底部之下。< / p>

用户滚动屏幕后,按钮会上升到需要的位置,然后停留在那里。

如果屏幕未滚动,则按钮会出现在应有的位置。

我知道我可以在按钮下面添加一些隐形容器并将它们强行放到屏幕上,但我宁愿有一个更强大的解决方案。

1 个答案:

答案 0 :(得分:0)

这有一些问题。首先,您使用的forceRevalidate应该在极少数情况下使用。

第二,似乎你在Form上调用了这个,这有点误导。虽然看起来:

f.add(myCmp);

将一个组件添加到表单中,它实际上是一个同义词:

f.getContentPane().add(myCmp);

这很重要,因为你需要调用可滚动容器上的scrollComponentToVisible,它实际上可以完成工作,理想情况下是所述组件的直接父级。我假设它是你案例中的内容窗格,但它取决于布局等。

最后一部分是让布局完成它的工作。如果您在表单显示之前调用它,则可能无效。请注意,在调用show之后执行此操作是没有意义的,因为表单可能需要一些时间来进行转换。您可以使用show listener或覆盖laidOut回调方法来执行此类操作。