我在 MigLayout 中使用“hidemode 3”,以便隐藏组件根本不可见(并且不会对布局产生任何影响)。
我使用它是为了可以在文本框下方显示内联错误,仅在出现错误时才显示
每当我显示这些内联错误框(它们是文本区域,所以我只调用 setVisible(true))时,嵌入表单的滚动 Pane 会自动向下滚动到设置为可见的任何内容(所以我调用 setVisible(true) )在某些东西上,它会导致布局更改并且滚动 Pane 自动向下滚动到组件所在的位置)
现在,这不是问题 - 我想我明白为什么会发生上述部分(大概是面板改变大小以适应新的布局,导致滚动条的比例变大,所以它出现 向下滚动)
我无法理解的是如何解决它 - 例如我尝试这样做:
// validateModel will cause the setVisible() calls to occur
if (!syncControl_.validateModel())
{
// Here I try and counteract the layout change by going back
// to the top
variableScrollPane_.getViewport().setViewPosition(new Point(0,0));
}
但它不起作用 - 或者更确切地说,它暂时起作用:滚动发生,但明显的“自动滚动”随后发生几毫秒。似乎无论重做布局,要么定期调用,要么 setVisible 实际上触发某种事件
我尝试在滚动更改之前调用 validate()、invalidate() repaint() 等,但没有效果。
所以我想我的问题是:当我使用 hidemode 3 并调用 setVisible() 时,执行“ react ”的方法是什么?是在验证/doLayout() 等期间还是发生了完全独立的事情?
谢谢
最佳答案
刚刚不小心回答了我自己的问题:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
variableScrollPane_.getVerticalScrollBar().setValue(0);
}
});
结果 MigLayout
根本不考虑这个因素(而且上面似乎是在许多情况下重置滚动条
的众所周知的机制)
关于java - Miglayout + hidemode 3 = 显示控件时不需要的自动滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5129963/