首页 文章

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

提问于
浏览
1

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

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

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

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

我期待继续按钮靠近屏幕顶部 .

如果在显示继续按钮之前滚动屏幕,则按钮会在屏幕底部结束(在我放入 scrollComponentToVisible 行之前它位于屏幕底部下方 .

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

如果屏幕未滚动,则按钮将显示在应有的位置 .

我知道我可以在按钮下方添加一些隐形容器并强制它们进入屏幕,但我宁愿有一个更强大的解决方案 .

1 回答

  • 0

    这有一些问题 . 首先,您使用 forceRevalidate ,应该在非常罕见的情况下使用 .

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

    f.add(myCmp);
    

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

    f.getContentPane().add(myCmp);
    

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

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

相关问题