我正在使用JScrollPane
而在viewportView.doLayout
内,我正在呼叫viewportView.setPreferredSize
。这似乎是错误的,因为JScrollPane
的滚动条总是根据setPreferredSize
之前的doLayout
更新。因此,如果是重新验证,JScrollPane
首先会根据首选大小更新滚动条,然后调用doLayout
。
我可以改变这种行为吗?或者我应该在哪里拨打setPreferredSize
?或者我应该在哪里放置布局子组件的代码?
我想出了一种有效的方法:
在this.setPreferredSize
内拨打this.setSize
和viewportView.doLayout
。
我保持这个问题是开放的,因为我不明白为什么会这样做(如果我删除其中一个就不行)并且想知道。
好吧,这很有效,因为它产生了无限循环,即它总是将一些重新验证请求推送到事件循环中,当然这解决了问题。但是,这不是一个真正的解决方案。
我现在有了这个:
// In viewportView of the JScrollPane:
@Override public void doLayout() {
// ... layout childs ...
// size.x/size.y being the size I want to have for the viewportView
if(size.x != getPreferredSize().width || size.y != getPreferredSize().height) {
setPreferredSize(new Dimension(size.x, size.y));
if(getParent() != null) getParent().validate();
}
}
现在似乎工作正常。
仍然想知道是否有人可以澄清这是否是正确的方式,如果没有,那会是什么。
答案 0 :(得分:0)
如果您希望JScrollPane
的内容(例如JPanel
)尺寸将其设置为内容。如果您希望JScrollPane
的大小设置为JScrollPane
。无需调用viewPortView的方法。