1

我在 MigLayout 中使用了“hidemode 3”,这样隐藏的组件根本不可见(并且对布局没有任何影响)。

我正在使用它,以便我可以在文本框下方显示内联错误,仅在出现错误时显示

每当我显示这些内联错误框(它们是文本区域,所以我只调用 setVisible(true))时,嵌入表单的滚动窗格会自动向下滚动到设置为可见的任何内容(所以我在某事上调用 setVisible(true) ,它会导致布局更改,并且滚动窗格会自动向下滚动到组件所在的位置)

现在,这不是问题 - 我想我明白为什么会发生上述部分(大概是面板改变大小以适应新布局会增加滚动条的比例,所以它似乎向下滚动)

我无法理解的是如何解决它 - 例如我尝试过这样做:

// 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() 时,它是什么方法进行“反应”?是在验证/ doLayout() 等期间还是发生了完全不同的事情?

谢谢

4

1 回答 1

0

只是不小心回答了我自己的问题:

SwingUtilities.invokeLater(new Runnable() {
      public void run() {
           variableScrollPane_.getVerticalScrollBar().setValue(0);                
      }            
}); 

结果根本没有考虑到这一点(而且上面似乎是在许多情况下MigLayout重置的众所周知的机制)scrollbar

于 2011-03-03T00:20:53.070 回答